You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
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