tablegen-mode.el revision 041b3f835682588cb63df7e609d726369dd6b7d3
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
19041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                       '("class" "defm" "def" "field" "include" "in"
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
52041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling;; URL: http://www.neilvandyke.org/jasmin-emacs/jasmin.el
53bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
54bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(if (not tablegen-mode-syntax-table)
55bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman    (progn
56bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman      (setq tablegen-mode-syntax-table (make-syntax-table))
57041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling      (mapcar (function
58041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling               (lambda (n)
59041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                 (modify-syntax-entry (aref n 0)
60041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                                      (aref n 1)
61041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                                      tablegen-mode-syntax-table)))
62bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman              '(
63bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; whitespace (` ')
64bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\^m " "]
65bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\f  " "]
66bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\n  " "]
67bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\t  " "]
68bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\   " "]
69bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; word constituents (`w')
70bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\%  "w"]
71bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;;[?_  "w  "]
72bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; comments
73bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\;  "< "]
74bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                [?\n  "> "]
75bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;;[?\r  "> "]
76bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;;[?\^m "> "]
77bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; symbol constituents (`_')
78bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; punctuation (`.')
79bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; open paren (`(')
80041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                [?\(  "("]
81041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                [?\[  "("]
82041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                [?\{  "("]
83041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                [?\<  "("]
84bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; close paren (`)')
85041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                [?\)  ")"]
86041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                [?\]  ")"]
87041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                [?\}  ")"]
88041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                [?\>  ")"]
89bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ;; string quote ('"')
90041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling                [?\"  "\""]
91bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman                ))))
92bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
93bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman;; --------------------- Abbrev table -----------------------------
94bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
95bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(defvar tablegen-mode-abbrev-table nil
96bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  "Abbrev table used while in TableGen mode.")
97bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(define-abbrev-table 'tablegen-mode-abbrev-table ())
98bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
99bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(defvar tablegen-mode-hook nil)
100bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(defvar tablegen-mode-map nil)   ; Create a mode-specific keymap.
101bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman
102bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman(if (not tablegen-mode-map)
103bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman    ()  ; Do not change the keymap if it is already set up.
104bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (setq tablegen-mode-map (make-sparse-keymap))
105041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling  (define-key tablegen-mode-map "\t"  'tab-to-tab-stop)
106bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (define-key tablegen-mode-map "\es" 'center-line)
107bdb41194dd4890dc1572d630d078708e095981f1Misha Brukman  (define-key tablegen-mode-map "\eS" 'center-paragraph))
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
118041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling  (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.
121041b3f835682588cb63df7e609d726369dd6b7d3Bill Wendling	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