diff --git a/ztl-mode.el b/ztl-mode.el index b2cddd1..e12eebe 100644 --- a/ztl-mode.el +++ b/ztl-mode.el @@ -1,74 +1,58 @@ -;;; ztl-mode.el --- Zongor's Transpiler Language (ZTL) mode for Emacs -*- lexical-binding: t; -*- -;; Author: Zongor -;; Version: 0.0.1 - -(defconst ztl-mode-hook nil - "Hook for Zongor's Transpiler Language mode.") - -(defconst ztl-file-extensions '(".ztl") - "List of file extensions for Zongor's Transpiler Language.") - -(defconst ztl-keywords - '("fn" "to" "in" "is" "as" "use" "set" "if" "else" "for" "loop" "while" - "push" "pop" "return" "const" "type" "this" "do" "end" "then" "result" - "function" "eq" "ne" "mod" "not" "and" "or" "xor" "band" "bor" "bxor" - "srl" "sll") - "List of Zongor's Transpiler Language keywords.") - -(defconst ztl-keywords-2 - '("char" "str" "f16" "f32" "f64" "f128") - "List of Zongor's Transpiler Language secondary keywords.") - -(defconst ztl-literals - '("true" "false") - "List of Zongor's Transpiler Language literals.") +;;; ztl-mode.el --- Major mode for ZTL programs ;;;###autoload -(define-derived-mode ztl-mode prog-mode "ZTL" - "Major mode for editing Zongor's Transpiler Language (ZTL)." +(add-to-list 'auto-mode-alist '("\\.ztl\\'" . ztl-mode)) - ;; File extension - (setq auto-mode-alist - (cons (cons ztl-file-extensions 'ztl-mode) auto-mode-alist)) +(defconst ztl-mode-syntax-table + (let ((syn-table (make-syntax-table))) + (modify-syntax-entry ?! "< b" syn-table) ; Line comment (extend to end of line) + (modify-syntax-entry ?\[ "(]" syn-table) + (modify-syntax-entry ?\] ")[" syn-table) + (modify-syntax-entry ?\" "\"" syn-table) + syn-table)) - ;; Comments - (setq comment-start "!") - (setq comment-end "") +(defvar ztl-keywords + '("fn" "to" "in" "is" "as" "use" "set" "if" "else" "for" "loop" + "while" "push" "pop" "return" "const" "type" "this" "eq" "ne" + "mod" "not" "and" "or" "xor" "band" "bor" "bxor" "srl" "sll")) - ;; Font Lock - (set (make-local-variable 'font-lock-defaults) - '((ztl-font-lock-keywords))) +(defvar ztl-types + '("char" "str" "i8" "i16" "i32" "i64" "i128" "f8" "f16" "f32" + "f64" "f128" "9p" "9pmsg")) - ;; Whitespace - (set (make-local-variable 'whitespace-line-column) - 80) - (whitespace-mode 1)) - -(defconst ztl-font-lock-keywords +(defvar ztl-font-lock-keywords `( ;; Comments - ("^!.*" . font-lock-comment-face) - ("!!.*!!" . font-lock-comment-face) - - ;; Strings - ("\\(\"\\([^\\\\\"]\\\\?.*?\\)\"\\|'\\([^\\\\']\\\\?.*?\\)'\\)" 1 font-lock-string-face) - - ;; Operators - (";" . font-lock-delimiter-face) + ("!.*$" 0 font-lock-comment-face) + ("!!\\(.*?\\)!!" 0 font-lock-comment-face) ;; Keywords - ,@(mapcar (lambda (kw) `(,kw . font-lock-keyword-face)) ztl-keywords) + (,(concat "\\<" (regexp-opt ztl-keywords) "\\>") 0 font-lock-keyword-face) - ;; Secondary keywords - ,@(mapcar (lambda (kw) `(,kw . font-lock-keyword-face)) ztl-keywords-2) + ;; Types + (,(concat "\\<" (regexp-opt ztl-types) "\\>") 0 font-lock-type-face) - ;; Literals - ,@(mapcar (lambda (lit) `(,lit . font-lock-builtin-face)) ztl-literals) + ;; Constants + ("\\_<\\(true\\|false\\)\\>" 1 font-lock-constant-face) + + ;; Structs (PascalCased) + ("\\_<\\([A-Z][a-zA-Z0-9_]+\\)\\>" 1 font-lock-type-face) ;; Function definitions - ("\\<\\([a-zA-Z_][a-zA-Z0-9_]*\\)\\s*(\\)" 1 font-lock-function-name-face))) + ("\\_\\s-+\\(\\w+\\)\\s-*(" (1 font-lock-function-name-face)) -;; Example usage in .emacs or init.el: -;; (add-to-list 'auto-mode-alist '("\\.ztl$" . ztl-mode)) + ;; Function calls + ("\\_<\\(\\w+\\)\\s-*(\\>" (1 font-lock-function-name-face)) +)) + +(define-derived-mode ztl-mode prog-mode "ZTL" + "Major mode for ZTL programming." + :syntax-table ztl-mode-syntax-table + (setq font-lock-multiline t) + (setq-local comment-start "!! ") + (setq-local comment-end "!!") + (setq-local comment-start-skip "!!+\\s-*") + (set (make-local-variable 'font-lock-defaults) + '(ztl-font-lock-keywords))) (provide 'ztl-mode)