summaryrefslogtreecommitdiff
path: root/Util
diff options
context:
space:
mode:
authorGravatar Rustan Leino <leino@microsoft.com>2012-10-04 15:38:05 -0700
committerGravatar Rustan Leino <leino@microsoft.com>2012-10-04 15:38:05 -0700
commita54b7d394f92a9af32cff46e854eb4d37705439e (patch)
treed655a930d37954b1f62ae264408eef2ce33775ec /Util
parentbd50fd6c2f2e042bc895d06ad6990bf0ee34cda4 (diff)
Migrated a missing file from the old Boogie codeplex
Diffstat (limited to 'Util')
-rw-r--r--Util/Emacs/jennisys-mode.el113
1 files changed, 113 insertions, 0 deletions
diff --git a/Util/Emacs/jennisys-mode.el b/Util/Emacs/jennisys-mode.el
new file mode 100644
index 00000000..d8f20a31
--- /dev/null
+++ b/Util/Emacs/jennisys-mode.el
@@ -0,0 +1,113 @@
+;; jennisys-mode.el - GNU Emacs mode for Jennisys
+;; Adapted by Rustan Leino from Jean-Christophe FILLIATRE's GNU Emancs mode for Why
+
+(defvar jennisys-mode-hook nil)
+
+(defvar jennisys-mode-map nil
+ "Keymap for Jennisys major mode")
+
+(if jennisys-mode-map nil
+ (setq jennisys-mode-map (make-keymap))
+ (define-key jennisys-mode-map "\C-c\C-c" 'jennisys-run-boogie)
+ (define-key jennisys-mode-map [(control return)] 'font-lock-fontify-buffer))
+
+(setq auto-mode-alist
+ (append
+ '(("\\.jen" . jennisys-mode))
+ auto-mode-alist))
+
+;; font-lock
+
+(defun jennisys-regexp-opt (l)
+ (concat "\\<" (concat (regexp-opt l t) "\\>")))
+
+(defconst jennisys-font-lock-keywords-1
+ (list
+ ; comments have the form /* ... */
+ '("/\\*\\([^*]\\|\\*[^/]\\)*\\*/" . font-lock-comment-face)
+ ; or // ...
+ '("//\\([^
+]\\)*" . font-lock-comment-face)
+
+ `(,(jennisys-regexp-opt '(
+ "interface" "datamodel" "code"
+ "var" "constructor" "method"
+ "frame" "invariant" "returns" "requires" "ensures"
+ )) . font-lock-builtin-face)
+ `(,(jennisys-regexp-opt '(
+ "if" "then" "else"
+ "forall" "exists"
+ "this" "in"
+ "false" "true" "null")) . font-lock-keyword-face)
+ `(,(jennisys-regexp-opt '("array" "bool" "int" "set" "seq")) . font-lock-type-face)
+ )
+ "Minimal highlighting for Jennisys mode")
+
+(defvar jennisys-font-lock-keywords jennisys-font-lock-keywords-1
+ "Default highlighting for Jennisys mode")
+
+;; syntax
+
+(defvar jennisys-mode-syntax-table nil
+ "Syntax table for jennisys-mode")
+
+(defun jennisys-create-syntax-table ()
+ (if jennisys-mode-syntax-table
+ ()
+ (setq jennisys-mode-syntax-table (make-syntax-table))
+ (set-syntax-table jennisys-mode-syntax-table)
+ (modify-syntax-entry ?' "w" jennisys-mode-syntax-table)
+ (modify-syntax-entry ?_ "w" jennisys-mode-syntax-table)))
+
+;; menu
+
+(require 'easymenu)
+
+(defun jennisys-menu ()
+ (easy-menu-define
+ jennisys-mode-menu (list jennisys-mode-map)
+ "Jennisys Mode Menu."
+ '("Jennisys"
+ ["Run Boogie" jennisys-run-boogie t]
+ "---"
+ ["Recolor buffer" font-lock-fontify-buffer t]
+ "---"
+ ))
+ (easy-menu-add jennisys-mode-menu))
+
+;; commands
+
+(defun jennisys-command-line (file)
+ (concat "boogie " file))
+
+(defun jennisys-run-boogie ()
+ "run Boogie to check the Jennisys program"
+ (interactive)
+ (let ((f (buffer-name)))
+ (compile (jennisys-command-line f))))
+
+;; setting the mode
+
+(defun jennisys-mode ()
+ "Major mode for editing Jennisys programs.
+
+\\{jennisys-mode-map}"
+ (interactive)
+ (kill-all-local-variables)
+ (jennisys-create-syntax-table)
+ ; hilight
+ (make-local-variable 'font-lock-defaults)
+ (setq font-lock-defaults '(jennisys-font-lock-keywords))
+ ; indentation
+ ; (make-local-variable 'indent-line-function)
+ ; (setq indent-line-function 'jennisys-indent-line)
+ ; menu
+ ; providing the mode
+ (setq major-mode 'jennisys-mode)
+ (setq mode-name "Jennisys")
+ (use-local-map jennisys-mode-map)
+ (font-lock-mode 1)
+ (jennisys-menu)
+ (run-hooks 'jennisys-mode-hook))
+
+(provide 'jennisys-mode)