;;; express-x.el --- Major mode for editing Express X schemata in Emacs ;; Author: Craig Lanning ;; Keywords: languages, step, iso ;; Code: ;; select ExpressX-Mode for *.exx files (require 'express) ;;;###autoload (pushnew '("\\.exx\\'" . expressx-mode) auto-mode-alist :test (lambda (x y) (equal (car x) (car y)))) (defconst expressx-mode-version "Express-X Mode 0.2" "Version of `exp-x.el'.") (defgroup expressx nil "Major mode for editing Express X schemata in Emacs" :group 'languages) (defvar expressx-mode-abbrev-table nil "Abbrev table for Express X mode.") (define-abbrev-table 'expressx-mode-abbrev-table '()) (defvar expressx-mode-syntax-table nil "Syntax table for Express X mode.") (if (not expressx-mode-syntax-table) (let ((i ?0)) (setq expressx-mode-syntax-table (make-syntax-table)) (while (< i (1+ ?9)) (modify-syntax-entry i "w" expressx-mode-syntax-table) (setq i (1+ i))) (setq i ?A) (while (< i (1+ ?Z)) (modify-syntax-entry i "w" expressx-mode-syntax-table) (setq i (1+ i))) (setq i ?a) (while (< i (1+ ?z)) (modify-syntax-entry i "w" expressx-mode-syntax-table) (setq i (1+ i))) ;; add (modify-syntax-entry ...) forms (modify-syntax-entry ?\ " " expressx-mode-syntax-table) (modify-syntax-entry ?\t " " expressx-mode-syntax-table) (modify-syntax-entry ?\[ "(]" expressx-mode-syntax-table) (modify-syntax-entry ?\] ")[" expressx-mode-syntax-table) (modify-syntax-entry ?\( "()1" expressx-mode-syntax-table) (modify-syntax-entry ?\) ")(4" expressx-mode-syntax-table) (modify-syntax-entry ?\* ". 23" expressx-mode-syntax-table) ;; if this is uncommented then XEmacs dies during syntactic ;; fontification of large EXPRESS-X files (modify-syntax-entry ?- ". 56" expressx-mode-syntax-table) ; (modify-syntax-entry ?- "." expressx-mode-syntax-table) (modify-syntax-entry ?\n "> b" expressx-mode-syntax-table) (modify-syntax-entry ?\' "\"" expressx-mode-syntax-table) (modify-syntax-entry ?_ "_" expressx-mode-syntax-table) (modify-syntax-entry ?> "." expressx-mode-syntax-table) (modify-syntax-entry ?< "." expressx-mode-syntax-table) (modify-syntax-entry ?: "." expressx-mode-syntax-table) (modify-syntax-entry ?\; "." expressx-mode-syntax-table) (modify-syntax-entry ?\\ "." expressx-mode-syntax-table) ) ) ;;; Menus stuff ;;(defvar expressx-mode-popup-menu nil) ;;(defvar expressx-mode-popup-menu-1 ;; (purecopy '("Express-X" ;; ["Insert ENTITY" expressx-insert-entity nil] ;; ["Insert FUNCTION" expressx-insert-function nil] ;; ["Insert PROCEDURE" expressx-insert-procedure nil] ;; ["Insert RULE" expressx-insert-rule nil] ;; ["Insert SCHEMA" expressxx-insert-schema nil] ;; ["Insert TYPE" express-insert-type nil] ;; "---" ;; ["Upcase Keywords in Buffer" expressx-upcase-buffer-keywords nil] ;; ["Upcase Keywords in Region" expressx-upcase-region-keywords nil] ;;(region-exists-p)] ;; "---" ;; ["Comment Out Region" expressx-comment-region nil] ;;(region-exists-p)] ;; "---" ;; ["Indent Buffer" expressx-indent-buffer nil] ;; ["Indent Region" expressx-indent-region nil] ;;(region-exists-p)] ;; ))) ;(defun expressx-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 expressx-keywords '(;; Inherited from Express "CONSTANT" "FUNCTION" "PROCEDURE" "RULE" ;;"ENTITY" "TYPE" "END_CONSTANT" "END_FUNCTION" "END_PROCEDURE" "END_RULE" ;;"END_ENTITY" "END_TYPE" "LOCAL" "END_LOCAL" "WHERE" ;; Local Express-X keywords "DEPENDENT_MAP" "EACH" "END_DEPENDENT_MAP" "END_MAP" "END_SCHEMA_MAP" "END_SCHEMA_VIEW" "END_VIEW" "EXTENT" "IDENTIFIED_BY" "MAP" "ORDERED_BY" "PARTITION" "SCHEMA_MAP" "SCHEMA_VIEW" "SOURCE" "TARGET" "VIEW")) (defvar expressx-functions '("ABS" "ACOS" "ASIN" "ATAN" "BLENGTH" "COS" "EXISTS" "EXP" "EXTENT" "FORMAT" "HIBOUND" "HIINDEX" "LENGTH" "LOBOUND" "LOINDEX" "LOG" "LOG2" "LOG10" "NVL" "ODD" "ROLESOF" "SIN" "SIZEOF" "SQRT" "TAN" "TYPEOF" "USEDIN" "VALUE" "VALUE_IN" "VALUE_UNIQUE")) (defvar expressx-mode-map nil "Keymap for Express X mode.") (if expressx-mode-map () (setq expressx-mode-map (make-sparse-keymap)) (set-keymap-name expressx-mode-map 'expressx-mode-map) ;; define Express X specific key bindings ;; (define-key expressx-mode-map "\M-;" 'expressx-indent-for-comment) ;; (define-key expressx-mode-map "\e\C-q" 'expressx-indent-definition) ) ;;;###autoload (defun expressx-mode () "Major mode for editing Express X schemata in Emacs. (add more detail later)." (interactive) (kill-all-local-variables) (use-local-map expressx-mode-map) (setq major-mode 'expressx-mode) (setq mode-name "ExpressX") (setq local-abbrev-table expressx-mode-abbrev-table) (set-syntax-table expressx-mode-syntax-table) (setq case-fold-search t) ; (unless express-mode-popup-menu ; (easy-menu-define expressx-mode-popup-menu expressx-mode-map "" ; expressx-mode-popup-menu-1)) ; (easy-menu-add expressx-mode-popup-menu) ; (express-mode-variables nil) ; (font-lock-set-defaults nil) (run-hooks 'expressx-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 expx-flkw-1 nil) (defvar expressx-mode-font-lock-keywords-1 nil "Minimum highlighting for EXPRESS mode.") (setq expx-flkw-1 (list '("\\<\\(\\(dependent_\\|\\)map\\|view\\|function\\|procedure\\|rule\\)\\>[ \t]+\\(\\w+\\)" (1 font-lock-keyword-face) (3 font-lock-function-name-face)) '("\\<\\(schema_\\(\\|map\\|view\\)\\)\\>[ \t]+\\(\\w+\\)" (1 font-lock-keyword-face) (3 font-lock-variable-name-face)) '("\\<\\(end_\\|\\)\\(constant\\|local\\)\\>" . font-lock-keyword-face) '("\\" . font-lock-keyword-face) )) (setq expressx-mode-font-lock-keywords-1 (purecopy (append express-flkw-1 expx-flkw-1 ))) (defvar expx-flkw-2 nil) (defvar expressx-mode-font-lock-keywords-2 nil "Medium highlighting for EXPRESS X mode.") (setq expx-flkw-2 (list (cons (concat "\\<\\(target\\|source\\|from\\|select\\|as\\|partition" "\\|return\\|\\(ordered\\|identified\\)_by\\)\\>") 'font-lock-keyword-face)) ) (setq expressx-mode-font-lock-keywords-2 (purecopy (append express-flkw-1 express-flkw-2 expx-flkw-1 expx-flkw-2 ))) (defvar expx-flkw-3 nil) (defvar expressx-mode-font-lock-keywords-3 nil "Maximum highlighting for EXPRESS X mode.") (setq expx-flkw-3 (list '("\\" . font-lock-keyword-face) '("\\<\\(if\\|then\\|else\\|case\\|for\\|each\\)\\>" . font-lock-keyword-face) )) (setq expressx-mode-font-lock-keywords-3 (purecopy (append express-flkw-1 express-flkw-2 express-flkw-3 expx-flkw-1 expx-flkw-2 expx-flkw-3 ))) (put 'expressx-mode 'font-lock-defaults ;; keywords kwords-only? case-fold? syntax-alist syntax-begin '((expressx-mode-font-lock-keywords-1 expressx-mode-font-lock-keywords-2 expressx-mode-font-lock-keywords-3) nil t ;; syntax-alist ((?_ . "w")) )) ;;; exp-x.el ends here