[mlir] Add mlir-mode.el

PiperOrigin-RevId: 205920209
diff --git a/utils/emacs/mlir-mode.el b/utils/emacs/mlir-mode.el
new file mode 100644
index 0000000..eff2882
--- /dev/null
+++ b/utils/emacs/mlir-mode.el
@@ -0,0 +1,68 @@
+;;; mlir-mode.el --- Major mode for the MLIR assembler language.
+
+;; Maintainer:
+;; Version: 0.0
+
+;;; Commentary:
+
+;; Major mode for editing MLIR files.
+
+;;; Code:
+
+(defvar mlir-mode-syntax-table
+  (let ((table (make-syntax-table)))
+    (modify-syntax-entry ?% "_" table)
+    (modify-syntax-entry ?@ "_" table)
+    (modify-syntax-entry ?# "_" table)
+    (modify-syntax-entry ?. "_" table)
+    (modify-syntax-entry ?/ ". 12" table)
+    (modify-syntax-entry ?\n "> " table)
+    table)
+  "Syntax table used while in MLIR mode.")
+
+(defvar mlir-font-lock-keywords
+  (list
+   ;; Variables
+   '("%[-a-zA-Z$._0-9]*" . font-lock-variable-name-face)
+   ;; Functions
+   '("@[-a-zA-Z$._0-9]*" . font-lock-function-name-face)
+   ;; Affinemaps
+   '("#[-a-zA-Z$._0-9]*" . font-lock-variable-name-face)
+   ;; Types
+   '("\\b\\(f16\\|bf16\\|f32\\|f64\\|affineint\\|i[1-9][0-9]*\\)\\b" . font-lock-type-face)
+   '("\\b\\(tensor\\|vector\\|memref\\)\\b" . font-lock-type-face)
+   ;; Dimension lists
+   '("\\b\\([0-9?]+x\\)*\\(f16\\|bf16\\|f32\\|f64\\|affineint\\|i[1-9][0-9]*\\)\\b" . font-lock-preprocessor-face)
+   ;; Integer literals
+   '("\\b[-]?[0-9]+\\b" . font-lock-preprocessor-face)
+   ;; Floating point constants
+   '("\\b[-+]?[0-9]+.[0-9]*\\([eE][-+]?[0-9]+\\)?\\b" . font-lock-preprocessor-face)
+   ;; Hex constants
+   '("\\b0x[0-9A-Fa-f]+\\b" . font-lock-preprocessor-face)
+   ;; Keywords
+   `(,(regexp-opt
+       '(;; Toplevel entities
+         "br" "ceildiv" "cfgfunc" "cond_br" "else" "extfunc" "false" "floordiv" "for" "if" "mlfunc" "mod" "return" "size" "step" "to" "true" "??" ) 'symbols) . font-lock-keyword-face))
+  "Syntax highlighting for MLIR.")
+
+;; Emacs 23 compatibility.
+(defalias 'mlir-mode-prog-mode
+  (if (fboundp 'prog-mode)
+      'prog-mode
+    'fundamental-mode))
+
+;;;###autoload
+(define-derived-mode mlir-mode mlir-mode-prog-mode "MLIR"
+  "Major mode for editing MLIR source files.
+\\{mlir-mode-map}
+  Runs `mlir-mode-hook' on startup."
+  (setq font-lock-defaults `(mlir-font-lock-keywords))
+  (setq-local comment-start "//"))
+
+;; Associate .mlir files with mlir-mode
+;;;###autoload
+(add-to-list 'auto-mode-alist (cons "\\.mlir\\'" 'mlir-mode))
+
+(provide 'mlir-mode)
+
+;;; mlir-mode.el ends here