95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;;;###autoload
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(autoload 'turn-on-casl-indent "casl-indent" "Turn on CASL indentation." t)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich;;;;;;;;;;;;;;;;;;;;;;;;;;
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich;; $Haeder$
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich;; Copyright: (c) Heng Jiang, Klaus L�ttich, Uni Bremen 2007
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich;; License: LGPL, see LICENSE.txt or LIZENZ.txt
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich;; Contact: hets-users@informatik.uni-bremen.de
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich;;;;;;;;;;;;;;;;;;;;;;;;;;
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; Version number
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang(defconst casl-mode-version "0.3"
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang "Version of CASL-Mode")
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defgroup casl nil
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich "Major mode for editing (heterogeneous) CASL specifications."
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang :group 'languages
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang :prefix "casl-")
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
b569e96f02dea40cb81899293c7d99e1d750b3c0Till Mossakowski
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defvar casl-mode-hook nil)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defvar casl-mode-map (let ((keymap (make-keymap)))
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (define-key keymap "\C-c\C-r" 'casl-run-hets-r)
1a5239c089cfe6c684855256c02496e6a7a4d281Heng Jiang (if (featurep 'xemacs)
1a5239c089cfe6c684855256c02496e6a7a4d281Heng Jiang (define-key keymap "\C-c\C-u" 'casl-run-hets-g)
b569e96f02dea40cb81899293c7d99e1d750b3c0Till Mossakowski (define-key keymap "\C-c\C-c" 'casl-run-hets-g))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (define-key keymap "\C-c\C-n" 'casl-compile-goto-next-error)
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder keymap)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang "Keymap for CASL major mode")
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; Are we running FSF Emacs or XEmacs?
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defvar casl-running-xemacs
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (string-match "Lucid\\|XEmacs" emacs-version)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang "non-nil if we are running XEmacs, nil otherwise.")
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang;; ====================== S Y N T A X T A B L E ==================
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang;; Syntax table for CASL major mode
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang(defvar casl-mode-syntax-table nil
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang "Syntax table for CASL mode.")
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang(if casl-mode-syntax-table
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang ()
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (let ((table (make-syntax-table)))
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang ;; Indicate that underscore may be part of a word
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (modify-syntax-entry ?_ "w" table)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (modify-syntax-entry ?\t " " table)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (modify-syntax-entry ?\" "\"" table)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (modify-syntax-entry ?\' "\'" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (mapcar (lambda (x)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (modify-syntax-entry x "_" table))
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang ;; Some of these are actually OK by default.
18d7a52788fff16e6f8d5a9f13dfb87080a3e245Heng Jiang "!#$&*+.,/\\\\:<=>?@^|~")
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang ;; commenting-out plus including other kinds of comment
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang ;; Comments
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (cond ((featurep 'xemacs)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?( "()" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?) ")(" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?{ "(}2" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?} "){3" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?[ "(]2" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?] ")[3" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?% "_ 14" table))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (t
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?\( "()" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?\) ")(" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?{ "(} 2n" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?} "){ 3n" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?% ". 14nb" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?\[ "(] 2n" table)
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (modify-syntax-entry ?\] ")[ 3n" table))
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang )
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (setq casl-mode-syntax-table table))
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang )
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang;; Various mode variables.
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang(defun casl-vars ()
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (kill-all-local-variables)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (make-local-variable 'comment-start)
20bcb42e212faef728ac606e69dc1f9de55a9988Heng Jiang (setq comment-start "%[")
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (make-local-variable 'comment-padding)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (setq comment-padding 0)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (make-local-variable 'comment-start-skip)
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich (setq comment-start-skip "%[{[]") ;; %[%{[]() *")
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (make-local-variable 'comment-column)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (setq comment-column 40)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (make-local-variable 'comment-indent-function)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (setq comment-indent-function 'casl-comment-indent)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (make-local-variable 'comment-end)
20bcb42e212faef728ac606e69dc1f9de55a9988Heng Jiang (setq comment-end "]%")
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich (set (make-local-variable 'comment-end-skip) "[\]}]%")
20bcb42e212faef728ac606e69dc1f9de55a9988Heng Jiang)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang;; Find the indentation level for a comment.
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang(defun casl-comment-indent ()
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (skip-chars-backward " \t")
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang ;; if the line is blank, put the comment at the beginning,
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang ;; else at comment-column
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (if (bolp) 0 (max (1+ (current-column)) comment-column)))
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; ============= K E Y W O R D H I G H L I G H T I N G ============
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang(defface casl-black-komma-face
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang `((t (:foreground "black")))
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang ""
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang :group 'basic-faces)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang(defface casl-blue-komma-face
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang `((t (:foreground "blue")))
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang ""
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang :group 'basic-faces)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang(defvar casl-black-komma-face 'casl-black-komma-face
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang "Face name to use for black komma.")
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defvar casl-annotation-face 'casl-annotation-face
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang "CASL mode face for Annotations")
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(setq casl-annotation-face 'font-lock-constant-face)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang(defvar casl-name-face 'casl-name-face)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang(setq casl-name-face 'font-lock-variable-name-face)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defvar casl-keyword-face 'casl-keyword-face)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(setq casl-keyword-face 'font-lock-keyword-face)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defvar casl-library-name-face 'casl-library-name-face)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(setq casl-library-name-face 'font-lock-type-face)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defvar casl-builtin-face 'casl-builtin-face)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(setq casl-builtin-face 'font-lock-builtin-face)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defvar casl-comment-face 'casl-comment-face)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(setq casl-comment-face 'font-lock-comment-face)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defvar casl-other-name-face 'casl-other-name-face)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang(if (featurep 'xemacs)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (setq casl-other-name-face 'casl-blue-komma-face)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (setq casl-other-name-face 'font-lock-function-name-face)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang(defvar casl-string-char-face 'casl-string-char-face)
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang(setq casl-string-char-face 'font-lock-string-face)
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; Syntax highlighting of CASL
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder;; "Warning: Do not design an element of font-lock-keywords to match
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder;; text which spans lines; this does not work reliably. While
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder;; font-lock-fontify-buffer handles multi-line patterns correctly,
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder;; updating when you edit the buffer does not, since it considers
20bcb42e212faef728ac606e69dc1f9de55a9988Heng Jiang;; text one line at a time." (from the GNU Emacs Lisp Reference Manual)
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich;; order of all the following highlighting rules is significant,
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich;; ony change if really needed
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich ;; Comment
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich(defconst casl-font-lock-specialcomment
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (list
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang '("%%.*$" (0 (symbol-value 'casl-comment-face) keep t)))
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich "Special Comment")
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich;; Alternativ for Annotation
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich(defconst casl-font-lock-annotations
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich (append casl-font-lock-specialcomment
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (list
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich ;; always highlight closing )%
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("\\(\)%\\)[^%]"
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (1 (symbol-value 'casl-annotation-face) keep t))
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich ;; %words \n
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("%\\w+\\b[^\n]*$"
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (0 (symbol-value 'casl-annotation-face) keep t))
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich ;; %(.....)%
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("[^%]\\(%\([^)]*?\)%\\)[^%]"
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (1 (symbol-value 'casl-annotation-face) keep t))
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich ;; %word( ... )%
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("\\(%\\sw+\([^)]*?\)%\\)[^%]"
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (1 (symbol-value 'casl-annotation-face) keep t))
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich ))
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich "Annotation")
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defconst casl-font-lock-keywords
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (append casl-font-lock-annotations
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (list
20bcb42e212faef728ac606e69dc1f9de55a9988Heng Jiang ;; reserved keyword
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("\\(\\<\\|\\s-+\\)\\(/\\\\\\|\\\\/\\|=>\\|<=>\\|and\\|arch\\|assoc\\|behaviourally\\|closed\\|comm\\|else\\|end\\|exists\\|fit\\|flexible\\|forall\\|free\\|generated\\|given\\|hide\\|idem\\|if\\|local\\|modality\\|not\\|orElse\\|refined\\|refinement\\|reveal\\|spec\\|then\\|to\\|unit\\|via\\|view\\|when\\|within\\|with\\|\\(\\(op\\|pred\\|var\\|type\\|sort\\)s?\\)\\)[,;]?[ \t\n]"
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (2 (symbol-value 'casl-keyword-face) keep t))
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang '("[,;.]" (0 (symbol-value 'casl-black-komma-face) t t))
20bcb42e212faef728ac606e69dc1f9de55a9988Heng Jiang ;; after forall don't highlight
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang '("\\bforall\\b\\(.*\\)"
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (1 (symbol-value 'casl-black-komma-face) keep t))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder ;; Keywords of loading Library
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("\\(\\<\\|\\s-+\\)\\(logic\\|from\\|get\\|library\\|version\\)[ :\t\n]+"
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (2 (symbol-value 'casl-builtin-face) keep t))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; Library and Logic name
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("\\b\\(library\\|logic\\)\\s-+\\(\\(\\w\\|/\\)+\\)\\(\\s-*->\\s-*\\(\\(\\w\\|/\\)+\\)\\)?[ \t\n]"
f5c7d6d3f873962ccbe63276243e88030ce8801dHeng Jiang (2 (symbol-value 'casl-library-name-face) keep t)
f5c7d6d3f873962ccbe63276243e88030ce8801dHeng Jiang (5 (symbol-value 'casl-library-name-face) keep t))
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang ;; name of from, get and given
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("\\b\\(get\\|given\\)[ \t\n]+\\(\\(\\sw+\\s-*\\(,[ \t\n]*\\|$\\)\\)+\\)\\(=\\|:\\|$\\)"
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (2 (symbol-value 'casl-name-face) t t))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("\\bfrom[ \t]+\\(.+\\)\\(get\\|$\\)"
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (1 (symbol-value 'casl-library-name-face) keep t))
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang ;; the name of specification and view
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang '("\\(\\<\\|\\[\\)\\(spec\\|view\\)\\s-+\\(\\w+\\)[ \t]*\\(\\[\\s-*\\([A-Z]\\w*\\).*\\s-*\\]\\)?\\s-*.*\\([]=:]\\|::=\\)"
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (3 (symbol-value 'casl-name-face) keep t)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (5 (symbol-value 'casl-name-face) keep t))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; then, and + name
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("\\b\\(and\\|then\\)[ \t\n]*\\([A-Z]\\w*\\)\\s-*\\(\\[\\([A-Z]\\sw*\\).*\\]\\)?"
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (2 (symbol-value 'casl-name-face) keep t)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (4 (symbol-value 'casl-name-face) keep t))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder ;; names before and after to
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("[ \t\n]*\\(\\sw+\\)[ \t\n]+to[ \t\n]+\\(\\(\\sw+\\)\\s-*\\(\\[\\([A-Z]\\sw*\\).*\\]\\)?[, \t]*\\)?"
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (1 (symbol-value 'casl-name-face) keep t)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (3 (symbol-value 'casl-name-face) keep t)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (5 (symbol-value 'casl-name-face) keep t))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder ;; instance name of specification
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang '("\\<spec.+=\\s-*\\(%\\sw+\\s-*\\)?[ \t\n]*\\([A-Z]\\w*\\)\\s-*\\(\\[\\s-*\\([A-Z]\\w*\\).*\\s-*\\]\\)?"
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (2 (symbol-value 'casl-name-face) keep t)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (4 (symbol-value 'casl-name-face) keep t))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder ;; Basic signature: sort X, Y, Z
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("\\(\\<\\|\\s-+\\)sorts?[ \t\n]+\\(\\(\\sw+\\s-*\\(\\[\\s-*\\(\\sw\\|,\\)+\\s-*\\]\\s-*\\)?\\(,\\(\\s-\\)*\\|$\\|<\\|;\\|=\\)\\(=\\|<\\|;\\|,\\)*[ \t\n]*\\)+\\)"
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (2 (symbol-value 'casl-other-name-face) keep t))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; Basic signature: op ,pred and var name
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang '("\\(\\(^[^.{%]\\)\\s-*\\|\\bops?\\b\\|\\bpreds?\\b\\|\\bvars?\\b\\)\\([^:{()\n]*\\)\\(\(.*\)\\)?:\\??[^?.:=%].*;?[ \t]*$"
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (2 (symbol-value 'casl-other-name-face) keep t)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (3 (symbol-value 'casl-other-name-face) keep t))
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang ;; highlight a line with , an end
20bcb42e212faef728ac606e69dc1f9de55a9988Heng Jiang '("^\\(\\(\\(__\\s-*[^_\n]+\\s-*__\\|[^.,:>\n]+\\)\\s-*,\\s-*\\)+\\)$"
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (0 (symbol-value 'casl-other-name-face) keep t))
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang ;; names before and after '|->'
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder '("[ \t\n]*\\(__[^|_]+__\\|[^[ \t\n]+\\)\\s-*\\(\\[\\([A-Z]\\w*\\).*\\]\\)?[ \t\n]*|->[ \t\n]*\\(__[^|_]+__\\|[^[ \t\n]+\\)\\s-*\\(\\[\\([A-Z]\\w*\\).*\\]\\)?[, \t]*"
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (1 (symbol-value 'casl-other-name-face) keep t)
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (3 (symbol-value 'casl-other-name-face) keep t)
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (4 (symbol-value 'casl-other-name-face) keep t)
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (6 (symbol-value 'casl-other-name-face) keep t))
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang ;; type name
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang '("\\(\\btype\\|\\bfree type\\)?\\s-+\\(\\sw+\\)\\s-+\\(\\sw*\\|\\[\\(\\s-*\\sw+\\s-*\\)\\]\\)[ \t\n]*::?=[ \t\n]*\\(\\(\_\_[^_]+\_\_\\|[^|][^(|]+\\)\\s-*\\(\(.*\)\\)?\\)"
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (2 (symbol-value 'casl-other-name-face) keep t)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (4 (symbol-value 'casl-other-name-face) keep t)
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (6 (symbol-value 'casl-other-name-face) keep t))
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ;; constructor
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang '("\|\\s-+\\(\_\_[^|_]+\_\_\\|[^|][^(|]+\\)\\s-*\\(\([^|]+\)\\)?[ \t\n]*"
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (1 (symbol-value 'casl-other-name-face) keep t))
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ;; in ()1
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang '("\(\\(\\(\\sw\\|,\\)*\\)\\s-*:\\??[^)]*\)"
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (1 (symbol-value 'casl-other-name-face) keep t))
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang ;; in ()2
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang '("\([^;]*;\\s-*\\(\\sw+\\)\\s-*:\\??.*\)"
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang (1 (symbol-value 'casl-other-name-face) keep t))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder ))
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang "Reserved keywords highlighting")
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang;; String and Char
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang(defconst casl-font-lock-string
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang (append casl-font-lock-keywords
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (list '("\\(\\(\"\\|^>[ \t]*\\\\\\)\\([^\"\\\\\n]\\|\\\\.\\)*\\(\"\\|\\\\[ \t]*$\\)\\|'\\([^'\\\\\n]\\|\\\\.[^'\n]*\\)'\\)"
1c7aefd3163ebc1cd1f56ed93f39a7d688b97fedHeng Jiang (0 (symbol-value 'casl-string-char-face) keep t))
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder "Syntax highlighting of String and Char")
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; Define default highlighting level
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; (defvar casl-font-lock-syntax-highligthing casl-font-lock-keywords
9312e4bac069d53091c92e20b03dcb4e07f40f9fHeng Jiang(defvar casl-font-lock-syntax-highligthing (symbol-value 'casl-font-lock-string)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang "Default syntax highlighting level in CASL mode")
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; ======================= R U N H E T S =======================
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(require 'compile)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
36089fe7ad5167b48f702514056071fd8739faeaHeng Jiang(setq casl-error-list nil)
175c9e5fde43fc804a8d25198133288669b9d54cKlaus Luettich(defvar hets-program nil)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang(defvar old-buffer nil)
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich(defvar casl-hets-options nil
79a7f2de0a7e933d26b64d35b2801618ff015954Klaus Luettich "*the additional options for running hets.")
175c9e5fde43fc804a8d25198133288669b9d54cKlaus Luettich
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang(defun casl-run-hets (&rest opt)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang "Run hets process to compile the current CASL file."
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (interactive)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (save-buffer nil)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (setq old-buffer (current-buffer))
d6814e7c7056c8078084f4fd0c627bfcebe935b0Heng Jiang (let* ((run-option " ")
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (casl-hets-file-name (buffer-file-name))
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang (outbuf (get-buffer-create "*hets-run*")))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (if hets-program
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (setq casl-hets-program hets-program)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (setq casl-hets-program "hets"))
f5ca7e49a6d1602c3f3a12ea6723fa67fea5757aHeng Jiang (if opt
d6814e7c7056c8078084f4fd0c627bfcebe935b0Heng Jiang (dolist (current opt run-option)
d6814e7c7056c8078084f4fd0c627bfcebe935b0Heng Jiang (setq run-option (concat run-option current " "))))
d6814e7c7056c8078084f4fd0c627bfcebe935b0Heng Jiang (setq hets-command (concat casl-hets-program run-option casl-hets-file-name))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; Pop up the compilation buffer.
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang (set-buffer outbuf)
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang (setq buffer-read-only nil)
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang (buffer-disable-undo (current-buffer))
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang (erase-buffer)
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang (buffer-enable-undo (current-buffer))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (set-buffer-modified-p nil)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (insert hets-command "\n")
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang (pop-to-buffer outbuf)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (goto-char (point-max))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; (display-buffer outbuf nil t)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (save-excursion
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; (set-buffer outbuf)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (compilation-mode "hets-compile")
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; Start the compilation.
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (if (fboundp 'start-process)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (let* ((process-environment
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (append
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (if (and (boundp 'system-uses-terminfo)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang system-uses-terminfo)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (list "TERM=dumb" "TERMCAP="
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (format "COLUMNS=%d" (window-width)))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (list "TERM=emacs"
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (format "TERMCAP=emacs:co#%d:tc=unknown:"
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (window-width))))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; Set the EMACS variable, but
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; don't override users' setting of $EMACS.
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (if (getenv "EMACS")
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang process-environment
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (cons "EMACS=t" process-environment))))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (proc (start-process-shell-command "hets-compile" outbuf
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang hets-command)))
f4152ab9d084afebd592edfcde4bf5a0d8556eddKlaus Luettich (setq buffer-read-only nil)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (set-process-sentinel proc 'casl-compilation-sentinel)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (set-process-filter proc 'casl-compilation-filter)
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (set-marker (process-mark proc) (point) outbuf))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (pop-to-buffer old-buffer)))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang(defun casl-run-hets-r (&rest opt)
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder "Run hets process with options (from casl-hets-options) to compile the
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang current CASL file."
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (interactive)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (setq option1 nil)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (setq option2 nil)
d6814e7c7056c8078084f4fd0c627bfcebe935b0Heng Jiang (setq run-option-r nil)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (if casl-hets-options
d6814e7c7056c8078084f4fd0c627bfcebe935b0Heng Jiang (setq run-option-r casl-hets-options))
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (if opt
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (dolist (current opt option2)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (setq option2 (concat option2 current " ")))
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang )
d6814e7c7056c8078084f4fd0c627bfcebe935b0Heng Jiang (setq run-option-r (concat run-option-r " " option2))
d6814e7c7056c8078084f4fd0c627bfcebe935b0Heng Jiang (casl-run-hets run-option-r)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang
f5ca7e49a6d1602c3f3a12ea6723fa67fea5757aHeng Jiang(defun casl-run-hets-g ()
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang "Run hets process with -g and other options (from variable casl-hets-options)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang to compile the current CASL file."
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski (interactive)
262ff0b92f2ba957c821ce8d9b4ee2f554cdf701Heng Jiang (casl-run-hets-r "-g")
f5ca7e49a6d1602c3f3a12ea6723fa67fea5757aHeng Jiang)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang;; sentinel and filter of asynchronous process of hets
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang;; Called when compilation process changes state.
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang(defun casl-compilation-sentinel (proc msg)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang "Sentinel for compilation buffers."
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (let ((buffer (process-buffer proc)))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (if (memq (process-status proc) '(signal exit))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (progn
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (if (null (buffer-name buffer))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; buffer killed
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (set-process-buffer proc nil)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (let ((obuf (current-buffer)))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; save-excursion isn't the right thing if
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; process-buffer is current-buffer
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (unwind-protect
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (progn
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; Write something in the compilation buffer
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; and hack its mode line.
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (set-buffer buffer)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (casl-compilation-handle-exit (process-status proc)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (process-exit-status proc)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang msg)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; Since the buffer and mode line will show that the
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; process is dead, we can delete it now. Otherwise it
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; will stay around until M-x list-processes.
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (delete-process proc))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (set-buffer obuf))))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; (setq compilation-in-progress (delq proc compilation-in-progress))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ))))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang;; show the message from hets compile direct on *hets-run* buffer
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang(defun casl-compilation-filter (proc string)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (display-buffer (process-buffer proc))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (unless (equal (buffer-name) "*hets-run*")
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (progn
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (pop-to-buffer "*hets-run*")
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (goto-char (point-max))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (with-current-buffer (process-buffer proc)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (let ((moving (= (point) (process-mark proc))))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (save-excursion
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; Insert the text, advancing the process marker.
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (goto-char (process-mark proc))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (insert string)
f5ca7e49a6d1602c3f3a12ea6723fa67fea5757aHeng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (set-marker (process-mark proc) (point)))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (if moving (goto-char (process-mark proc)))))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (pop-to-buffer old-buffer))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang(defun casl-compilation-handle-exit (process-status exit-status msg)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang "Write msg in the current buffer and hack its mode-line-process."
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (let ((buffer-read-only nil)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (status (cons msg exit-status))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (omax (point-max))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (opoint (point)))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; Record where we put the message, so we can ignore it
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; later on.
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; (goto-char omax)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (goto-char (point-max))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (insert ?\n mode-name " " (car status))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (if (bolp)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (forward-char -1))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (insert " at " (substring (current-time-string) 0 19))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (goto-char (point-max))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (setq mode-line-process (format ":%s [%s]" process-status (cdr status)))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; Force mode line redisplay soon.
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (force-mode-line-update)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (if (and opoint (< opoint omax))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (goto-char opoint))
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; Automatically parse (and mouse-highlight) error messages:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (if (zerop exit-status)
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang (setq casl-error-list nil)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (setq casl-error-list nil)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (casl-parse-error)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (message "%s errors have been found." (length casl-error-list)))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (pop-to-buffer old-buffer)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ))
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang;; also functions with old hets-program?
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defun casl-parse-error ()
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang "Error Parser"
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (interactive)
c10df434f8e16b46ccf703bf2e38b799f7bcb38bHeng Jiang (setq casl-error-list nil)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;;;(pop-to-buffer compiler-buffer)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (pop-to-buffer "*hets-run*")
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (goto-char (point-min))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (while (not (eobp))
d6814e7c7056c8078084f4fd0c627bfcebe935b0Heng Jiang (if (not (or (looking-at "Fail") (and (looking-at "\\*\\*\\*") (looking-at "[0-9]+\\.[0-9]+-[0-9]+\\.[0-9]*"))))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (forward-line 1)
3d59ee7815197f19948fc512cd90f9f26fd4d78fHeng Jiang (skip-chars-forward "a-zA-Z*,/._\\- ")
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang (if (not (search-forward ":" (save-excursion (end-of-line) (point)) t 1))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (forward-line 1)
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang (re-search-backward "\\(\(\\|\\s-+\\)\\([^.]+\\.\\(casl\\|het\\)\\)" nil t 1)
c51b5677113ce7260c44afb3c5932eea6c875e27Heng Jiang (setq file-name (match-string-no-properties 2))
f5ca7e49a6d1602c3f3a12ea6723fa67fea5757aHeng Jiang (re-search-forward ":\\([0-9]+\\)\\.\\([0-9]+\\)\\(-[0-9]+\\.[0-9]*\\)?[:,]" (save-excursion (end-of-line) (point)) t 1)
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang (when (not (string= (match-string-no-properties 0) ""))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (setq error-line (match-string-no-properties 1))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (setq error-colnum (match-string-no-properties 2))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (setq error-window-point (point))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (setq casl-error-list
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (nconc casl-error-list (list (list file-name error-line error-colnum error-window-point))))
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang )
c51b5677113ce7260c44afb3c5932eea6c875e27Heng Jiang (forward-line 1)))))
c51b5677113ce7260c44afb3c5932eea6c875e27Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defun casl-compile-goto-next-error ()
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang "search the next error position from error-list, and move to it."
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (interactive)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; if error-list is empty ...
3d59ee7815197f19948fc512cd90f9f26fd4d78fHeng Jiang (if (null casl-error-list)
3d59ee7815197f19948fc512cd90f9f26fd4d78fHeng Jiang (casl-parse-error))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (if (null casl-error-list)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (if (member (get-buffer "*hets-run*") (buffer-list))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (message "no error.")
876096baba5bb126049ecde28ff6644fae78d7a3Christian Maeder (message "this file have not yet been compiled."))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (let* ((this-error (pop casl-error-list))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (error-file-name (nth 0 this-error))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (error-line (nth 1 this-error))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (error-column (nth 2 this-error))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (error-window-point (nth 3 this-error)))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang ;; (message "DEBUG<Goto Error>: file: %s, line: %s, column: %s" error-file-name error-line error-column)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; if the file already opened ...
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (if (get-file-buffer error-file-name)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (pop-to-buffer (get-file-buffer error-file-name))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (generate-new-buffer error-file-name)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (pop-to-buffer error-file-name)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (insert-file-contents error-file-name))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; switch to hets-run window to jump to next error message
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (setq file-buffer (current-buffer))
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (pop-to-buffer "*hets-run*")
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (goto-char error-window-point)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ;; return to current file
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang (pop-to-buffer file-buffer)
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang (goto-line (string-to-number error-line))
c51b5677113ce7260c44afb3c5932eea6c875e27Heng Jiang (move-to-column (- (string-to-number error-column) 1))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (message "goto next error... line: %s column: %s" error-line error-column)
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang (setq casl-error-list (nconc casl-error-list (list this-error)))
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang )))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; ================= C A S L M A J O R M O D E ===============
f5ca7e49a6d1602c3f3a12ea6723fa67fea5757aHeng Jiang;; casl major mode setup
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; Definition of CASL major mode
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(defun casl-mode ()
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang "Major mode for editing CASL models"
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (interactive)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (casl-vars)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (setq major-mode 'casl-mode)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (setq mode-name "CASL")
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; Load keymap
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (use-local-map casl-mode-map)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; Load syntax table
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (set-syntax-table casl-mode-syntax-table)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; (casl-create-syntax-table)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; Highlight CASL keywords
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (make-local-variable 'font-lock-defaults)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (setq font-lock-defaults
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang '(casl-font-lock-syntax-highligthing))
20bcb42e212faef728ac606e69dc1f9de55a9988Heng Jiang (make-local-variable 'font-lock-keywords-only)
20bcb42e212faef728ac606e69dc1f9de55a9988Heng Jiang (setq font-lock-keywords-only nil)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; Support for compile.el
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; We just substitute our own functions to go to the error.
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (add-hook 'compilation-mode-hook
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (lambda()
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (set (make-local-variable 'compile-auto-highlight) 40)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ;; FIXME: This has global impact! -stef
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (define-key compilation-minor-mode-map [mouse-2]
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang 'casl-compile-mouse-goto-error)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (define-key compilation-minor-mode-map "\C-m"
36089fe7ad5167b48f702514056071fd8739faeaHeng Jiang 'casl-compile-goto-next-error)))
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (run-hooks 'casl-mode-hook)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang )
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang(provide 'casl-mode)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang;; CASL-mode ends here