fix comments, add new keywords

This commit is contained in:
zongor 2025-10-17 12:55:26 -07:00
parent bfec1109a8
commit e5e235f95c
1 changed files with 101 additions and 95 deletions

196
undar-mode.el Normal file → Executable file
View File

@ -1,95 +1,101 @@
;;; undar-mode.el --- Major mode for editing Undar code -*- lexical-binding: t; -*-
;; Copyright (C) 2025 zongor
;;
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;;
(defvar undar-keywords
'("function" "to" "in" "is" "as" "use" "if" "else" "default"
"for" "try" "catch" "while" "do" "exit" "switch"
"return" "const" "type" "this" "yield" "case"
"assert" "break" "mod" "not" "and" "or" "print" "let"
"band" "bor" "bxor" "srl" "sll")
"Keywords in Undar.")
(defvar undar-types
'("byte" "str" "real" "bool"
"int" "nat" "f32" "f64"
"u8" "u16" "u32" "u64"
"i8" "i16" "i32" "i64")
"Types in Undar.")
(defvar undar-constants
'("true" "false" "nil")
"Constants in Undar.")
(defvar undar-font-lock-keywords
`(
;; Keywords
(,(regexp-opt undar-keywords 'words) . font-lock-keyword-face)
;; Types
(,(regexp-opt undar-types 'words) . font-lock-type-face)
;; Constants
(,(regexp-opt undar-constants 'words) . font-lock-constant-face)
;; Structs: CamelCase identifiers
("\\b[A-Z][a-zA-Z0-9_]*\\b" . font-lock-type-face)
;; Function definitions: "fn name(...)"
("\\_<function\\>\\s-+\\(\\w+\\)(" (1 font-lock-function-name-face))
;; Function calls: "name(...)"
("\\_<\\([a-zA-Z_][a-zA-Z0-9_]*\\)\\s-*(" (1 font-lock-function-name-face))
;; Floating point numbers
("\\b-?[0-9]+\\.[0-9]+\\b" . font-lock-constant-face)
;; Integers
("\\b-?[0-9]+\\b" . font-lock-constant-face)
;; Strings with double quotes
("\"[^\"\n]*\"" . font-lock-string-face)
;; Strings with backticks
("`[^`]*`" . font-lock-string-face))
"Font lock keywords for Undar mode.")
(defvar undar-mode-syntax-table
(let ((st (make-syntax-table)))
;; '/' starts a comment
(modify-syntax-entry ?! "<" st)
(modify-syntax-entry ?\n ">" st)
;; Strings
(modify-syntax-entry ?\" "\"" st)
(modify-syntax-entry ?` "\"" st)
st)
"Syntax table for Undar mode.")
(define-derived-mode undar-mode prog-mode "Undâr"
"Major mode for editing Undar code."
:syntax-table undar-mode-syntax-table
(setq-local font-lock-defaults '(undar-font-lock-keywords))
(setq-local comment-start "! ")
(setq-local comment-end "")
(setq-local parse-sexp-ignore-comments t)
(setq-local indent-line-function 'c-indent-line))
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.ul\\'" . undar-mode))
(provide 'undar-mode)
;;; undar-mode.el ends here
;;; undar-mode.el --- Major mode for editing Undar code -*- lexical-binding: t; -*-
;; Copyright (C) 2025 zongor
;;
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;;
(defvar undar-keywords
'("function" "to" "in" "is" "as" "use" "if" "else" "default"
"for" "try" "catch" "while" "do" "exit" "switch" "continue"
"return" "const" "type" "this" "yield" "case" "loop" "plex"
"assert" "break" "mod" "not" "and" "or" "print" "ref" "interface"
"implements" "impls" "band" "bor" "bxor" "srl" "sll")
"Keywords in Undar.")
(defvar undar-types
'("byte" "str" "real" "bool"
"int" "nat" "f32" "void"
"u8" "u16" "u32"
"i8" "i16" "i32")
"Types in Undar.")
(defvar undar-constants
'("true" "false" "nil")
"Constants in Undar.")
(defvar undar-font-lock-keywords
`(
;; Keywords
(,(regexp-opt undar-keywords 'words) . font-lock-keyword-face)
;; Types
(,(regexp-opt undar-types 'words) . font-lock-type-face)
;; Constants
(,(regexp-opt undar-constants 'words) . font-lock-constant-face)
;; Structs: CamelCase identifiers
("\\b[A-Z][a-zA-Z0-9_]*\\b" . font-lock-type-face)
;; Function definitions: "function name(...)"
("\\_<function\\>\\s-+\\([\\w+\\)(" (1 font-lock-function-name-face))
;; Numbers (Integers and Floats)
("\\b-?[0-9]+\\(?:\\.[0-9]+\\)?\\(?:[eE][+-]?[0-9]+\\)?\\b" . font-lock-constant-face)
;; Strings with double quotes
("\"[^\"\n]*\"" . font-lock-string-face)
;; Strings with backticks
("`[^`\n]*`" . font-lock-string-face))
"Font lock keywords for Undar mode.")
(defvar undar-mode-syntax-table
(let ((st (make-syntax-table)))
;; C-style comments: // and /* */
;; Clear potential existing syntax for / and * if needed (though default is usually fine initially)
;; Clearing standard C++/C comment syntax if it was somehow set beforehand is generally not needed
;; unless explicitly overridden elsewhere, so we rely on the default being clean.
;; The crucial setup for both // and /* */ comments together:
;; / is punctuation and starts both // (1, 2) and /* (4) comments
(modify-syntax-entry ?\/ ". 124" st)
;; * is punctuation and part of /* */ (2, 3) and also part of // (b) comments (this is key for //)
(modify-syntax-entry ?* ". 23b" st)
;; Newline ends comments (>) and is part of // comments (b) - essential for // to end correctly
(modify-syntax-entry ?\n ">" st)
;; Strings
(modify-syntax-entry ?\" "\"" st)
(modify-syntax-entry ?` "\"" st)
st)
"Syntax table for Undar mode, using C-style comments (// and /* */).")
(define-derived-mode undar-mode prog-mode "Undâr"
"Major mode for editing Undar code."
:syntax-table undar-mode-syntax-table
(setq-local font-lock-defaults '(undar-font-lock-keywords))
;; Set comment syntax for commands like M-; (comment-dwim)
(setq-local comment-start "// ")
(setq-local comment-end "")
(setq-local comment-start-skip "\\(//+\\|/\\*+\\)\\s *")
;; Ensure comments are ignored during parsing (e.g., for indentation)
(setq-local parse-sexp-ignore-comments t)
;; Use C-style indentation function
(setq-local indent-line-function 'c-indent-line))
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.ul\\'" . undar-mode))
(provide 'undar-mode)
;;; undar-mode.el ends here