This commit is contained in:
zongor 2025-04-19 20:32:58 -04:00
parent 55e62a7975
commit 290692570f
1 changed files with 41 additions and 57 deletions

View File

@ -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)))
("\\_<fn\\>\\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)