tablegen-mode.el revision d4eeb800439da892c73be63919eb7a289140ced6
19dce2b33807f47d794b0482313ae3fe0d275c833Reid Spencer;; Maintainer:  The LLVM team, http://llvm.org/
2bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman;; Description: Major mode for TableGen description files (part of LLVM project)
3d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling;; Updated:     2007-03-26
4d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling
5d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling(require 'comint)
6d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling(require 'custom)
7d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling(require 'ansi-color)
8bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
9bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman;; Create mode-specific tables.
10bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(defvar tablegen-mode-syntax-table nil
11bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  "Syntax table used while in TableGen mode.")
12bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
13d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling(defvar td-decorators-face 'td-decorators-face
14d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling  "Face method decorators.")
15d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling(make-face 'td-decorators-face)
16d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling
17bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(defvar tablegen-font-lock-keywords
18d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling  (let ((kw (mapconcat 'identity
19d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling                       '("class" "def" "defm" "field" "in" "include"
20d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling                         "let" "multiclass")
21d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling                       "\\|"))
22d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling        (type-kw (mapconcat 'identity
23d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling                            '("bit" "bits" "code" "dag" "int" "list" "string")
24d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling                            "\\|"))
25d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling        )
26d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling    (list
27d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     ;; Comments
28d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     '("\/\/" . font-lock-comment-face)
29d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     ;; Strings
30d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     '("\"[^\"]+\"" . font-lock-string-face)
31d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     ;; Hex constants
32d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     '("0x[0-9A-Fa-f]+" . font-lock-preprocessor-face)
33d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     ;; Binary constants
34d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     '("0b[01]+" . font-lock-preprocessor-face)
35d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     ;; Integer literals
36d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     '("[-]?[0-9]+" . font-lock-preprocessor-face)
37d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     ;; Floating point constants
38d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     '("[-+]?[0-9]+\.[0-9]*\([eE][-+]?[0-9]+\)?" . font-lock-preprocessor-face)
39d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling
40d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     '("^[ \t]*\\(@.+\\)" 1 'td-decorators-face)
41d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     ;; Keywords
42d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     (cons (concat "\\<\\(" kw "\\)\\>[ \n\t(]") 1)
43d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling
44d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     ;; Type keywords
45d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     (cons (concat "\\<\\(" type-kw "\\)[ \n\t(]") 1)
46d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling     ))
47d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling  "Additional expressions to highlight in TableGen mode.")
48d4eeb800439da892c73be63919eb7a289140ced6Bill Wendling(put 'tablegen-mode 'font-lock-defaults '(tablegen-font-lock-keywords))
49bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
50bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman;; ---------------------- Syntax table ---------------------------
51bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman;; Shamelessly ripped from jasmin.el
52bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman;; URL: http://www.neilvandyke.org/jasmin-emacs/jasmin.el.html
53bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
54bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(if (not tablegen-mode-syntax-table)
55bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman    (progn
56bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman      (setq tablegen-mode-syntax-table (make-syntax-table))
57bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman      (mapcar (function (lambda (n)
58bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                          (modify-syntax-entry (aref n 0)
59bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                                               (aref n 1)
60bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                                               tablegen-mode-syntax-table)))
61bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman              '(
62bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; whitespace (` ')
63bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\^m " "]
64bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\f  " "]
65bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\n  " "]
66bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\t  " "]
67bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\   " "]
68bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; word constituents (`w')
69bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;;[?<  "w"]
70bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;;[?>  "w"]
71bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\%  "w"]
72bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;;[?_  "w  "]
73bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; comments
74bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\;  "< "]
75bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\n  "> "]
76bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;;[?\r  "> "]
77bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;;[?\^m "> "]
78bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; symbol constituents (`_')
79bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; punctuation (`.')
80bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; open paren (`(')
81bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\( "("]
82bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\[ "("]
83bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\{ "("]
84bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; close paren (`)')
85bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\) ")"]
86bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\] ")"]
87bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\} ")"]
88bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; string quote ('"')
89bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\" "\""]
90bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ))))
91bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
92bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman;; --------------------- Abbrev table -----------------------------
93bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
94bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(defvar tablegen-mode-abbrev-table nil
95bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  "Abbrev table used while in TableGen mode.")
96bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(define-abbrev-table 'tablegen-mode-abbrev-table ())
97bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
98bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(defvar tablegen-mode-hook nil)
99bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(defvar tablegen-mode-map nil)   ; Create a mode-specific keymap.
100bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
101bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(if (not tablegen-mode-map)
102bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman    ()  ; Do not change the keymap if it is already set up.
103bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (setq tablegen-mode-map (make-sparse-keymap))
104bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (define-key tablegen-mode-map "\t" 'tab-to-tab-stop)
105bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (define-key tablegen-mode-map "\es" 'center-line)
106bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (define-key tablegen-mode-map "\eS" 'center-paragraph))
107bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
108bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
109bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(defun tablegen-mode ()
110bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  "Major mode for editing TableGen description files.
111bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  \\{tablegen-mode-map}
112bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  Runs tablegen-mode-hook on startup."
113bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (interactive)
114bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (kill-all-local-variables)
115bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (use-local-map tablegen-mode-map)         ; Provides the local keymap.
116bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (setq major-mode 'tablegen-mode)
117bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
118bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (make-local-variable	'font-lock-defaults)
119bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (setq major-mode 'tablegen-mode           ; This is how describe-mode
120bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                                            ;   finds the doc string to print.
121bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman	mode-name "TableGen"                      ; This name goes into the modeline.
122bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman	font-lock-defaults `(tablegen-font-lock-keywords))
123bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
124bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (setq local-abbrev-table tablegen-mode-abbrev-table)
125bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (set-syntax-table tablegen-mode-syntax-table)
126bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (run-hooks 'tablegen-mode-hook))          ; Finally, this permits the user to
127bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                                            ;   customize the mode with a hook.
128bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
129bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman;; Associate .td files with tablegen-mode
130bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(setq auto-mode-alist (append '(("\\.td$" . tablegen-mode)) auto-mode-alist))
131bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
132bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(provide 'tablegen-mode)
133bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman;; end of tablegen-mode.el
134