;;; lego-syntax.el --- Syntax of LEGO ;; This file is part of Proof General. ;; Portions © Copyright 1994-2012 David Aspinall and University of Edinburgh ;; Portions © Copyright 2003, 2012, 2014 Free Software Foundation, Inc. ;; Portions © Copyright 2001-2017 Pierre Courtieu ;; Portions © Copyright 2010, 2016 Erik Martin-Dorel ;; Portions © Copyright 2011-2013, 2016-2017 Hendrik Tews ;; Portions © Copyright 2015-2017 Clément Pit-Claudel ;; Author: Thomas Kleymann and Dilip Sequeira ;; Maintainer: Paul Callaghan ;; License: GPL (GNU GENERAL PUBLIC LICENSE) ;;; Commentary: ;; ;;; Code: (require 'proof-syntax) ;; ----- keywords for font-lock. (defconst lego-keywords-goal '("$?Goal")) (defconst lego-keywords-save '("$?Save" "SaveFrozen" "SaveUnfrozen")) (defconst lego-commands (append lego-keywords-goal lego-keywords-save '("allE" "allI" "andE" "andI" "Assumption" "Claim" "Cut" "Discharge" "DischargeKeep" "echo" "exE" "exI" "Expand" "ExpAll" "ExportState" "Equiv" "For" "Freeze" "Hnf" "Immed" "impE" "impI" "Induction" "Inductive" "Invert" "Init" "intros" "Intros" "Module" "Next" "Normal" "notE" "notI" "orE" "orIL" "orIR" "qnify" "Qnify" "Qrepl" "Record" "Refine" "Repeat" "Try" "Unfreeze")) "Subset of LEGO keywords and tacticals which are terminated by a \?;") (defconst lego-keywords (append lego-commands '("Constructors" "Double" "ElimOver" "Fields" "Import" "Inversion" "NoReductions" "Parameters" "Relation" "Theorems"))) (defconst lego-tacticals '("Then" "Else" "Try" "Repeat" "For")) ;; ----- regular expressions for font-lock (defconst lego-error-regexp "^\\(cannot assume\\|Error\\|Lego parser\\)" "A regular expression indicating that the LEGO process has identified an error.") (defvar lego-id proof-id) (defvar lego-ids (concat lego-id "\\(\\s *,\\s *" lego-id "\\)*") "*For font-lock, we treat \",\" separated identifiers as one identifier and refontify commata using \\{lego-fixup-change}.") (defconst lego-arg-list-regexp "\\s *\\(\\[[^]]+\\]\\s *\\)*" "Regular expression maching a list of arguments.") (defun lego-decl-defn-regexp (char) (concat "\\[\\s *\\(" lego-ids "\\)" lego-arg-list-regexp char)) ; Examples ; ^ ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ ; [ sort = ; [ sort [n:nat] = ; [ sort [abbrev=...][n:nat] = (defconst lego-definiendum-alternative-regexp (concat "\\(" lego-id "\\)" lego-arg-list-regexp "\\s * ==") "Regular expression where the first match identifies the definiendum.") (defvar lego-font-lock-terms (list ; lambda binders (list (lego-decl-defn-regexp "[:|?]") 1 'proof-declaration-name-face) ; let binders (list lego-definiendum-alternative-regexp 1 'font-lock-function-name-face) (list (lego-decl-defn-regexp "=") 1 'font-lock-function-name-face) ; Pi and Sigma binders (list (concat "[{<]\\s *\\(" lego-ids "\\)") 1 'proof-declaration-name-face) ;; Kinds (cons (concat "\\\\|\\