153 lines
No EOL
5.4 KiB
EmacsLisp
153 lines
No EOL
5.4 KiB
EmacsLisp
;;; hept-mode.el --- major mode for Heptagon files
|
|
|
|
;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
|
|
;;
|
|
;; Author: adrien.guatto@ens.fr
|
|
;; Keywords: languages
|
|
;; Version: 1.0
|
|
;; X-URL: http://heptagon.gforge.inria.fr
|
|
|
|
;; This file is not part of GNU Emacs.
|
|
|
|
;;; Commentary:
|
|
|
|
;; Major mode for editing Heptagon files, usually files ending
|
|
;; with `.ept' and `.epi'.
|
|
|
|
;; This package provides the following features:
|
|
;; * Syntax coloring (via font-lock) for grammar symbols and
|
|
;; builtin functions and variables
|
|
;; * Indentation for the current line (TAB) and selected region (C-M-\).
|
|
;; * Switching between file.vert and file.frag
|
|
;; with S-lefttab (via ff-find-other-file)
|
|
|
|
;;; Installation:
|
|
|
|
;; If hept-mode is not part of your distribution, put this file into your
|
|
;; load-path and the following into your ~/.emacs:
|
|
;; (autoload 'hept-mode "hept-mode" nil t)
|
|
;; (add-to-list 'auto-mode-alist '("\\.ept\\'" . hept-mode))
|
|
;; (add-to-list 'auto-mode-alist '("\\.epi\\'" . hept-mode))
|
|
|
|
;; To customize, use `M-x customize-group RET antlr RET' or the custom browser
|
|
;; (Emacs->Programming->Languages->Antlr).
|
|
|
|
;;; Code:
|
|
|
|
(provide 'hept-mode)
|
|
|
|
(eval-when-compile
|
|
(require 'find-file))
|
|
|
|
(defconst hept-version "1.0"
|
|
"Heptagon major mode version number.")
|
|
|
|
(defvar hept-mode-hook nil)
|
|
|
|
(defvar hept-mode-map
|
|
(let ((hept-mode-map (make-sparse-keymap)))
|
|
(define-key hept-mode-map [S-iso-lefttab] 'ff-find-other-file)
|
|
hept-mode-map)
|
|
"Keymap for Heptagon major mode")
|
|
|
|
(add-to-list 'auto-mode-alist '("\\.ept\\'" . hept-mode))
|
|
(add-to-list 'auto-mode-alist '("\\.ept\\'" . hept-mode))
|
|
|
|
;; (regexp-opt '(
|
|
;; "fun" "node" "returns" "open" "inlined" "let" "tel" "var" "const"
|
|
;; )
|
|
;; t)
|
|
|
|
;; (regexp-opt '(
|
|
;; "bool" "int" "float"
|
|
;; )
|
|
;; t)
|
|
|
|
;; (regexp-opt '(
|
|
;; "with" "merge" "when" "whenot"
|
|
;; "fby" "pre" "on" "onot" "not" "end" "automaton" "state"
|
|
;; "switch" "every" "reset" "until" "unless"
|
|
;; "last" "if" "then" "else" "default" "do" "done" "in" "continue"
|
|
;; "contract" "assume" "enforce" "with"
|
|
;; "map" "fold" "mapfold" "mapi" "foldi" "mapfoldi"
|
|
;; )
|
|
;; t)
|
|
|
|
(defconst hept-font-lock-keywords-1
|
|
(list
|
|
'(
|
|
"\\<\\(const\\|fun\\|inlined\\|let\\|node\\|open\\|returns\\|tel\\|var\\)\\>"
|
|
.
|
|
font-lock-variable-name-face)
|
|
'("\\<\\(bool\\|\\(?:floa\\|in\\)t\\)\\>"
|
|
.
|
|
font-lock-builtin-face)
|
|
'(
|
|
"\\<\\(a\\(?:ssume\\|utomaton\\)\\|cont\\(?:inue\\|ract\\)\\|d\\(?:efault\\|o\\(?:ne\\)?\\)\\|e\\(?:lse\\|n\\(?:d\\|force\\)\\|very\\)\\|f\\(?:by\\|oldi?\\)\\|i[fn]\\|last\\|m\\(?:ap\\(?:foldi?\\|i\\)?\\|erge\\)\\|on\\(?:ot\\)?\\|pre\\|reset\\|s\\(?:tate\\|witch\\)\\|not\\|then\\|un\\(?:less\\|til\\)\\|w\\(?:hen\\(?:ot\\)?\\|ith\\)\\)\\>"
|
|
.
|
|
font-lock-keyword-face)
|
|
)
|
|
"Minimal highlighting expressions for Heptagon mode")
|
|
|
|
(defvar hept-font-lock-keywords hept-font-lock-keywords-1
|
|
"Default highlighting expressions for Heptagon mode")
|
|
|
|
(defvar hept-mode-syntax-table
|
|
(let ((hept-mode-syntax-table (make-syntax-table)))
|
|
(modify-syntax-entry ?( "()1n" hept-mode-syntax-table)
|
|
(modify-syntax-entry ?) ")(4n" hept-mode-syntax-table)
|
|
(modify-syntax-entry ?* ". 23" hept-mode-syntax-table)
|
|
(modify-syntax-entry ?< "(>" hept-mode-syntax-table)
|
|
(modify-syntax-entry ?> ")<" hept-mode-syntax-table)
|
|
(modify-syntax-entry ?\ "\\" hept-mode-syntax-table)
|
|
(modify-syntax-entry ?_ "_" hept-mode-syntax-table)
|
|
(modify-syntax-entry ?: "." hept-mode-syntax-table)
|
|
; (modify-syntax-entry ?\n "> b" hept-mode-syntax-table)
|
|
hept-mode-syntax-table)
|
|
"Syntax table for hept-mode")
|
|
|
|
(defun hept-indent-line ()
|
|
"Indent current line as Heptagon code"
|
|
(interactive)
|
|
(if (bobp)
|
|
(indent-line-to 0)
|
|
(let ((not-indented t) cur-indent)
|
|
(save-excursion
|
|
(while not-indented
|
|
(forward-line -1)
|
|
(if (looking-at "^[ \t]*\\(tel\\|end\\|done\\|every\\)")
|
|
(progn
|
|
(setq cur-indent (current-indentation))
|
|
(setq not-indented nil))
|
|
; Check for rule 4
|
|
(if (looking-at
|
|
"^[ \t]*\\(let\\|automaton\\)")
|
|
(progn
|
|
(setq cur-indent (+ (current-indentation) default-tab-width))
|
|
(setq not-indented nil))
|
|
(if (looking-at "^[ \t]*\\(do\\|reset\\)")
|
|
(progn
|
|
(setq cur-indent (+ (current-indentation) 3))
|
|
(setq not-indented nil))
|
|
(if (bobp) ; Check for rule 5
|
|
(setq not-indented nil)))))))
|
|
(if cur-indent
|
|
(indent-line-to cur-indent)
|
|
(indent-line-to 0)))))
|
|
|
|
(defvar hept-other-file-alist
|
|
'(("\\.ept$" (".epi"))
|
|
("\\.epi$" (".ept")))
|
|
"Alist of extensions to find given the current file's extension")
|
|
|
|
(define-derived-mode hept-mode fundamental-mode "Heptagon"
|
|
"Major mode for editing Heptagon files."
|
|
:syntax-table hept-mode-syntax-table
|
|
(set (make-local-variable 'comment-start) "(*")
|
|
(set (make-local-variable 'comment-end) "*)")
|
|
(set (make-local-variable 'indent-line-function) 'hept-indent-line)
|
|
(set (make-local-variable 'font-lock-defaults) '(hept-font-lock-keywords))
|
|
(set (make-local-variable 'ff-other-file-alist) 'hept-other-file-alist)
|
|
)
|
|
|
|
;;; hept-mode.el ends here |