This commit is contained in:
zongor 2025-04-19 20:32:58 -04:00
parent 55e62a7975
commit 7dacca3f5d
1 changed files with 39 additions and 62 deletions

View File

@ -1,74 +1,51 @@
;;; ztl-mode.el --- Zongor's Transpiler Language (ZTL) mode for Emacs -*- lexical-binding: t; -*- ;;; Zongor's Transpiler Language (ZTL) mode for Emacs
;; Author: Zongor ;; Author: Zongor
;; Version: 0.0.1 ;; Version: 0.0.1
(defconst ztl-mode-hook nil (defvar ztl-constants
"Hook for Zongor's Transpiler Language mode.") '("true" "false"))
(defconst ztl-file-extensions '(".ztl") (defvar ztl-keywords
"List of file extensions for Zongor's Transpiler Language.") '("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"))
(defconst ztl-keywords (defvar ztl-keywords2
'("fn" "to" "in" "is" "as" "use" "set" "if" "else" "for" "loop" "while" '("char" "str" "f16" "f32" "f64" "f128"))
"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 (defvar ztl-operators
'("char" "str" "f16" "f32" "f64" "f128") '(";"))
"List of Zongor's Transpiler Language secondary keywords.")
(defconst ztl-literals (defvar ztl-functions
'("true" "false") '("fn" "to" "in" "is" "as" "use" "set" "if" "else" "for" "loop" "while" "push" "pop" "return" "const" "type" "this"
"List of Zongor's Transpiler Language literals.") "eq" "ne" "mod" "not" "and" "or" "xor" "band" "bor" "bxor" "srl" "sll"))
;;;###autoload (defvar ztl-font-lock-defaults
(define-derived-mode ztl-mode prog-mode "ZTL" `((("\\<\\(!!.*?!!\\)\\>" . font-lock-comment-face) ; Block comments
"Major mode for editing Zongor's Transpiler Language (ZTL)." ("!!.*" . font-lock-comment-face) ; Line comments
("\\<\\(!.*\\)" . font-lock-comment-face) ; Line comments
("\\<\\([A-Z][%w_]*\\)\\>" . font-lock-keyword2-face) ; Keywords2
("\\<\\([viu][%d_]+\\)\\>" . font-lock-keyword2-face) ; Keywords2
("\\<\\([9][%w_]*\\)\\>" . font-lock-keyword2-face) ; Keywords2
("\\<\\([A-Z][%w_]*\\)\\>" . font-lock-keyword2-face) ; Keywords2
("\\<\\(-?%.?%d+f?\\)\\>" . font-lock-constant-face) ; Numbers
("\\<\\(fn\\)\\>\\s-*\\(\\([%a_][%w_]*\\)\\s*%(" . (1 font-lock-keyword-face) (2 font-lock-function-name-face)) ; Function definitions
(,(regexp-opt ztl-keywords 'words) . font-lock-keyword-face) ; Keywords
(,(regexp-opt ztl-keywords2 'words) . font-lock-builtin-face) ; Keywords2
(,(regexp-opt ztl-constants 'words) . font-lock-constant-face) ; Constants
(,(regexp-opt ztl-operators 'words) . font-lock-builtin-face) ; Operators
("\"\\([^\"]*\\)\"" . font-lock-string-face) ; Strings
("'\\([^']*\\)'" . font-lock-string-face) ; Strings
))
;; File extension (define-derived-mode ztl-mode fundamental-mode "ZTL"
(setq auto-mode-alist "Major mode for editing ZTL files."
(cons (cons ztl-file-extensions 'ztl-mode) auto-mode-alist)) (setq font-lock-defaults ztl-font-lock-defaults)
;; Comments
(setq comment-start "!") (setq comment-start "!")
(setq comment-end "") (setq comment-end "")
(modify-syntax-entry ?! "<" ztl-mode-syntax-table)
(modify-syntax-entry ?\n ">" ztl-mode-syntax-table)
(modify-syntax-entry ?\" "\"" ztl-mode-syntax-table)
(modify-syntax-entry ?\' "\"" ztl-mode-syntax-table)
(modify-syntax-entry ?\\ "\\" ztl-mode-syntax-table))
;; Font Lock (provide 'ztl-mode)
(set (make-local-variable 'font-lock-defaults)
'((ztl-font-lock-keywords)))
;; Whitespace
(set (make-local-variable 'whitespace-line-column)
80)
(whitespace-mode 1))
(defconst ztl-font-lock-keywords
`(
;; Comments
("^!.*" . font-lock-comment-face)
("!!.*!!" . font-lock-comment-face)
;; Strings
("\\(\"\\([^\\\\\"]\\\\?.*?\\)\"\\|'\\([^\\\\']\\\\?.*?\\)'\\)" 1 font-lock-string-face)
;; Operators
(";" . font-lock-delimiter-face)
;; Keywords
,@(mapcar (lambda (kw) `(,kw . font-lock-keyword-face)) ztl-keywords)
;; Secondary keywords
,@(mapcar (lambda (kw) `(,kw . font-lock-keyword-face)) ztl-keywords-2)
;; Literals
,@(mapcar (lambda (lit) `(,lit . font-lock-builtin-face)) ztl-literals)
;; Function definitions
("\\<\\([a-zA-Z_][a-zA-Z0-9_]*\\)\\s*(\\)" 1 font-lock-function-name-face)))
;; Example usage in .emacs or init.el:
;; (add-to-list 'auto-mode-alist '("\\.ztl$" . ztl-mode))
(provide 'ztl-mode)