;;; express.el --- Major mode for editing Express schemata in Emacs ;; Author: Craig Lanning ;; Keywords: languages, step, iso ;; Code: ;; select Express-Mode for *.exp files ;;;###autoload (pushnew '("\\.exp\\'" . express-mode) auto-mode-alist :test (lambda (x y) (equal (car x) (car y)))) (defconst express-mode-version "Express-Mode 0.1" "Version of `express.el'.") (defgroup express nil "Major mode for editing Express schemata in Emacs" :group 'languages) (defvar express-mode-abbrev-table nil "Abbrev table for Express mode.") (define-abbrev-table 'express-mode-abbrev-table '()) (defvar express-mode-syntax-table nil "Syntax table for Express mode.") (if (not express-mode-syntax-table) (let ((i 0)) (setq express-mode-syntax-table (make-syntax-table)) (while (< i ?0) (modify-syntax-entry i "_ " express-mode-syntax-table) (incf i)) (while (< i (1+ ?9)) (modify-syntax-entry i "w " express-mode-syntax-table) (setq i (1+ i))) (while (< i ?A) (modify-syntax-entry i "_ " express-mode-syntax-table) (incf i)) (while (< i (1+ ?Z)) (modify-syntax-entry i "w " express-mode-syntax-table) (setq i (1+ i))) (while (< i ?a) (modify-syntax-entry i "_ " express-mode-syntax-table) (incf i)) (while (< i (1+ ?z)) (modify-syntax-entry i "w " express-mode-syntax-table) (setq i (1+ i))) (while (< i 128) (modify-syntax-entry i "_ " express-mode-syntax-table) (incf i)) ;; add (modify-syntax-entry ...) forms (modify-syntax-entry ?\ " " express-mode-syntax-table) (modify-syntax-entry ?\t " " express-mode-syntax-table) (modify-syntax-entry ?\f " " express-mode-syntax-table) (modify-syntax-entry ?\n "> " express-mode-syntax-table) (modify-syntax-entry ?\^m "> " express-mode-syntax-table) (modify-syntax-entry ?\[ "(] " express-mode-syntax-table) (modify-syntax-entry ?\] ")[ " express-mode-syntax-table) (modify-syntax-entry ?\( "()1 " express-mode-syntax-table) (modify-syntax-entry ?\) ")(4 " express-mode-syntax-table) (modify-syntax-entry ?\* ". 23" express-mode-syntax-table) ;; if this is uncommented then XEmacs dies during syntactic ;; fontification of large EXPRESS files (modify-syntax-entry ?- ". 56" express-mode-syntax-table) ; (modify-syntax-entry ?- ". " express-mode-syntax-table) (modify-syntax-entry ?\n "> b " express-mode-syntax-table) (modify-syntax-entry ?\' "\" " express-mode-syntax-table) (modify-syntax-entry ?_ "_ " express-mode-syntax-table) (modify-syntax-entry ?> ". " express-mode-syntax-table) (modify-syntax-entry ?< ". " express-mode-syntax-table) (modify-syntax-entry ?: ". " express-mode-syntax-table) (modify-syntax-entry ?\; ". " express-mode-syntax-table) (modify-syntax-entry ?\\ ". " express-mode-syntax-table) (modify-syntax-entry ?\/ ". " express-mode-syntax-table) (modify-syntax-entry ?+ ". " express-mode-syntax-table) (modify-syntax-entry ?\. ". " express-mode-syntax-table) ) ) ;;; Menus stuff ;;(defvar express-mode-popup-menu nil) ;;(defvar express-mode-popup-menu-1 ;; (purecopy '("Express" ;; ["Insert ENTITY" express-insert-entity nil] ;; ["Insert FUNCTION" express-insert-function nil] ;; ["Insert PROCEDURE" express-insert-procedure nil] ;; ["Insert RULE" express-insert-rule nil] ;; ["Insert SCHEMA" express-insert-schema nil] ;; ["Insert TYPE" express-insert-type nil] ;; "---" ;; ["Upcase Keywords in Buffer" express-upcase-buffer-keywords nil] ;; ["Upcase Keywords in Region" express-upcase-region-keywords nil] ;;(region-exists-p)] ;; "---" ;; ["Comment Out Region" express-comment-region nil] ;;(region-exists-p)] ;; "---" ;; ["Indent Buffer" express-indent-buffer nil] ;; ["Indent Region" express-indent-region nil] ;;(region-exists-p)] ;; ))) ;(defun express-mode-variables (express-syntax) ; (cond (express-syntax ; (set-syntax-table express-mode-syntax-table))) ; (setq local-abbrev-table express-mode-abbrev-table) ; ;; not sure what else to put here ; ) (defvar express-keywords '("ABSTRACT" "AGGREGATE" "ALIAS" "ARRAY" "AS" "BAG" "BEGIN" "BINARY" "BOOLEAN" "BY" "CASE" "CONSTANT" "CONTEXT" "DERIVE" "ELSE" "END" "END_ALIAS" "END_CASE" "END_CONSTANT" "END_CONTEXT" "END_ENTITY" "END_FUNCTION" "END_IF" "END_LOCAL" "END_MODEL" "END_PROCEDURE" "END_REPEAT" "END_RULE" "END_SCHEMA" "END_TYPE" "ENTITY" "ENUMERATION" "ESCAPE" "FIXED" "FOR" "FROM" "FUNCTION" "GENERIC" "IF" "INSERT" "INTEGER" "INVERSE" "LIST" "LOCAL" "LOGICAL" "MODEL" "NUMBER" "OF" "ONEOF" "OPTIONAL" "OTHERWISE" "PROCEDURE" "QUERY" "REAL" "REFERENCE" "REMOVE" "REPEAT" "RETURN" "RULE" "SCHEMA" "SELECT" "SET" "SKIP" "STRING" "SUBTYPE" "SUPERTYPE" "THEN" "TO" "TYPE" "UNIQUE" "UNTIL" "USE" "VAR" "WHERE" "WHILE")) (defvar express-operators '("AND" "ANDOR" "DIV" "IN" "LIKE" "MOD" "NOT" "OR" "XOR")) (defvar express-constants '("?" "CONST_E" "FALSE" "PI" "SELF" "TRUE" "UNKNOWN")) (defvar express-functions '("ABS" "ACOS" "ASIN" "ATAN" "BLENGTH" "COS" "EXISTS" "EXP" "FORMAT" "HIBOUND" "HIINDEX" "LENGTH" "LOBOUND" "LOG" "LOG2" "LOG10" "LOINDEX" "NVL" "ODD" "ROLESOF" "SIN" "SIZEOF" "SQRT" "TAN" "TYPEOF" "USEDIN" "VALUE")) (defvar express-procedures '("INSERT" "REMOVE")) (defvar express-mode-map nil "Keymap for Express mode.") (if express-mode-map () (setq express-mode-map (make-sparse-keymap)) (set-keymap-name express-mode-map 'express-mode-map) ;; define Express specific key bindings ;; (define-key express-mode-map "\M-;" 'express-indent-for-comment) ;; (define-key express-mode-map "\e\C-q" 'express-indent-definition) ) ;;;###autoload (defun express-mode () "Major mode for editing Express schemata in Emacs. (add more detail later)." (interactive) (kill-all-local-variables) (use-local-map express-mode-map) (setq major-mode 'express-mode) (setq mode-name "Express") (setq local-abbrev-table express-mode-abbrev-table) (set-syntax-table express-mode-syntax-table) (setq case-fold-search t) ; (unless express-mode-popup-menu ; (easy-menu-define express-mode-popup-menu express-mode-map "" ; express-mode-popup-menu-1)) ; (easy-menu-add express-mode-popup-menu) ; (express-mode-variables nil) ; (font-lock-set-defaults nil) (run-hooks 'express-mode-hook)) ;;; ;;; Font-Lock/Colorizing stuff ;;; ;;; fontified by syntax: ;; font-lock-comment-face (* ... *) ;; font-lock-string-face 'string' ;;; fontified by regexp: ;; font-lock-comment-face -- ... ;; font-lock-doc-string-face ;; font-lock-keyword-face various EXPRESS words ;; font-lock-function-name-face [a-z][a-z0-9_]* ;; font-lock-variable-name-face SELF ;; font-lock-type-face ARRAY BAG SET LIST STRING NUMBER INTEGER REAL ;; font-lock-reference-face ;; font-lock-preprocessor-face ;; font-lock-warning-face (defvar express-flkw-1 nil) (defvar express-mode-font-lock-keywords-1 nil "Minimum highlighting for EXPRESS mode.") (setq express-flkw-1 (purecopy (list ;;'("--.*" . font-lock-comment-face) '("\\<\\(entity\\|type\\)\\>[ \t]+\\(\\w+\\)" (1 font-lock-keyword-face) (2 font-lock-type-face)) '("\\<\\(function\\|procedure\\|rule\\)\\>[ \t]+\\(\\w+\\)" (1 font-lock-keyword-face) (2 font-lock-function-name-face)) '("\\<\\(schema\\)\\>[ \t]+\\(\\w+\\)" (1 font-lock-keyword-face) (2 font-lock-variable-name-face)) '("\\<\\(constant\\|end_\\(schema\\|constant\\)\\)\\>" . font-lock-keyword-face) ) )) (setq express-mode-font-lock-keywords-1 express-flkw-1) (defvar express-flkw-2 nil) (defvar express-mode-font-lock-keywords-2 nil "Medium highlighting for EXPRESS mode.") (setq express-flkw-2 (list '("\\<\\(derive\\|inverse\\|unique\\|where\\)\\>" . font-lock-keyword-face) '("\\<\\(abstract\\|supertype\\|subtype\\|for\\|of\\|oneof\\|optional\\)\\>" 1 font-lock-keyword-face) '("\\<\\(select\\|enumeration\\)\\>" . font-lock-keyword-face) (cons (concat "\\<\\(number\\|real\\|integer\\|string\\|boolean\\|logical\\|" "generic\\|list\\|set\\|bag\\|array\\|aggregate\\)\\>") 'font-lock-type-face) )) (setq express-mode-font-lock-keywords-2 (purecopy (append express-flkw-1 express-flkw-2 ))) (defvar express-flkw-3 nil) (defvar express-mode-font-lock-keywords-3 nil "Maximum highlighting for EXPRESS mode.") (setq express-flkw-3 (list '("\\" . font-lock-keyword-face) '("\\<\\(in\\|query\\|subtype\\|of\\|from\\|use\\|reference\\)\\>" . font-lock-keyword-face) ;; EXPRESS Operators '("\\<\\(and\\|andor\\|div\\|in\\|like\\|mod\\|not\\|or\\|xor\\)\\>" . font-lock-function-name-face) ;; EXPRESS Functions (cons (concat "\\<\\(abs\\|acos\\|asin\\|atan\\|blength\\|cos\\|exists\\|" "exp\\|format\\|hibound\\|hiindex\\|length\\|" "lo\\(bound\\|g\\|g2\\|g10\\|index\\)\\|nvl\\|odd\\|rolesof\\|" "sin\\|sizeof\\|sqrt\\|tan\\|typeof\\|usedin\\|value\\)\\>") 'font-lock-function-name-face) ;; EXPRESS Constants '("\\<\\(\\?\\|const_e\\|false\\|pi\\|self\\|true\\|unknown\\)\\>" . font-lock-variable-name-face) ;; EXPRESS Procedures '("\\<\\(insert\\|remove\\)\\>" . font-lock-function-name-face) )) (setq express-mode-font-lock-keywords-3 (purecopy (append express-flkw-1 express-flkw-2 express-flkw-3 ))) (put 'express-mode 'font-lock-defaults ;; keywords kwords-only? case-fold? syntax-alist syntax-begin '((express-mode-font-lock-keywords-1 express-mode-font-lock-keywords-2 express-mode-font-lock-keywords-3) nil t ;; syntax-alist ((?_ . "w")) )) (provide 'express) ;;; express.el ends here