]> gitweb.factorcode.org Git - factor.git/commitdiff
FUEL: Add UNION-STRUCT: to syntax highlighting.
authorErik Charlebois <erikcharlebois@gmail.com>
Mon, 22 Feb 2010 00:42:31 +0000 (16:42 -0800)
committerErik Charlebois <erikcharlebois@gmail.com>
Mon, 22 Feb 2010 00:42:31 +0000 (16:42 -0800)
misc/fuel/fuel-syntax.el

index 1b060e5dd17e085b7d02e4f5cd5a5f787e4371d0..7de627f8f5e9e22c542e159d391aef7049a497b9 100644 (file)
-;;; fuel-syntax.el --- auxiliar definitions for factor code navigation.
-
-;; Copyright (C) 2008, 2009  Jose Antonio Ortega Ruiz
-;; See http://factorcode.org/license.txt for BSD license.
-
-;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
-;; Keywords: languages
-
-;;; Commentary:
-
-;; Auxiliar constants and functions to parse factor code.
-
-;;; Code:
-
-(require 'thingatpt)
-
-\f
-;;; Thing-at-point support for factor symbols:
-
-(defun fuel-syntax--beginning-of-symbol ()
-  "Move point to the beginning of the current symbol."
-  (skip-syntax-backward "w_()"))
-
-(defsubst fuel-syntax--beginning-of-symbol-pos ()
-  (save-excursion (fuel-syntax--beginning-of-symbol) (point)))
-
-(defun fuel-syntax--end-of-symbol ()
-  "Move point to the end of the current symbol."
-  (skip-syntax-forward "w_()"))
-
-(defsubst fuel-syntax--end-of-symbol-pos ()
-  (save-excursion (fuel-syntax--end-of-symbol) (point)))
-
-(put 'factor-symbol 'end-op 'fuel-syntax--end-of-symbol)
-(put 'factor-symbol 'beginning-op 'fuel-syntax--beginning-of-symbol)
-
-(defsubst fuel-syntax-symbol-at-point ()
-  (let ((s (substring-no-properties (thing-at-point 'factor-symbol))))
-    (and (> (length s) 0) s)))
-
-
-\f
-;;; Regexps galore:
-
-(defconst fuel-syntax--parsing-words
-  '(":" "::" ";" "&:" "<<" "<PRIVATE" ">>"
-    "ABOUT:" "ALIAS:" "ALIEN:" "ARTICLE:"
-    "B" "BIN:"
-    "C:" "CALLBACK:" "C-ENUM:" "C-STRUCT:" "C-TYPE:" "C-UNION:" "CHAR:" "CONSTANT:" "call-next-method"
-    "DEFER:"
-    "EBNF:" ";EBNF" "ERROR:" "EXCLUDE:"
-    "f" "FORGET:" "FROM:" "FUNCTION:"
-    "GAME:" "GENERIC#" "GENERIC:"
-    "GLSL-SHADER:" "GLSL-PROGRAM:"
-    "HELP:" "HEX:" "HOOK:"
-    "IN:" "initial:" "INSTANCE:" "INTERSECTION:"
-    "LIBRARY:"
-    "M:" "M::" "MACRO:" "MACRO::" "MAIN:" "MATH:"
-    "MEMO:" "MEMO:" "METHOD:" "MIXIN:"
-    "OCT:"
-    "POSTPONE:" "PREDICATE:" "PRIMITIVE:" "PRIVATE>" "PROVIDE:"
-    "QUALIFIED-WITH:" "QUALIFIED:"
-    "read-only" "RENAME:" "REQUIRE:"  "REQUIRES:"
-    "SINGLETON:" "SINGLETONS:" "SLOT:" "SPECIALIZED-ARRAY:" "SPECIALIZED-ARRAYS:" "STRING:" "STRUCT:" "SYMBOL:" "SYMBOLS:" "SYNTAX:"
-    "TUPLE:" "t" "t?" "TYPEDEF:" "TYPED:" "TYPED::"
-    "UNIFORM-TUPLE:" "UNION:" "USE:" "USING:"
-    "VARS:" "VERTEX-FORMAT:"))
-
-(defconst fuel-syntax--parsing-words-regex
-  (regexp-opt fuel-syntax--parsing-words 'words))
-
-(defconst fuel-syntax--bracers
-  '("B" "BV" "C" "CS" "H" "T" "V" "W"))
-
-(defconst fuel-syntax--brace-words-regex
-  (format "%s{" (regexp-opt fuel-syntax--bracers t)))
-
-(defconst fuel-syntax--declaration-words
-  '("flushable" "foldable" "inline" "parsing" "recursive" "delimiter"))
-
-(defconst fuel-syntax--declaration-words-regex
-  (regexp-opt fuel-syntax--declaration-words 'words))
-
-(defsubst fuel-syntax--second-word-regex (prefixes)
-  (format "%s +\\([^ \r\n]+\\)" (regexp-opt prefixes t)))
-
-(defconst fuel-syntax--method-definition-regex
-  "^M::? +\\([^ ]+\\) +\\([^ ]+\\)")
-
-(defconst fuel-syntax--integer-regex
-  "\\_<-?[0-9]+\\_>")
-
-(defconst fuel-syntax--raw-float-regex
-  "[0-9]*\\.[0-9]*\\([eE][+-]?[0-9]+\\)?")
-
-(defconst fuel-syntax--float-regex
-  (format "\\_<-?%s\\_>" fuel-syntax--raw-float-regex))
-
-(defconst fuel-syntax--number-regex
-  (format "\\([0-9]+\\|%s\\)" fuel-syntax--raw-float-regex))
-
-(defconst fuel-syntax--ratio-regex
-  (format "\\_<[+-]?%s/-?%s\\_>"
-          fuel-syntax--number-regex
-          fuel-syntax--number-regex))
-
-(defconst fuel-syntax--bad-string-regex
-  "\\_<\"[^>]\\([^\"\n]\\|\\\\\"\\)*\n")
-
-(defconst fuel-syntax--word-definition-regex
-  (format "\\_<\\(%s\\)?: +\\_<\\(\\w+\\)\\_>"
-          (regexp-opt
-           '(":" "GENERIC" "DEFER" "HOOK" "MAIN" "MATH" "POSTPONE"
-             "SYMBOL" "SYNTAX" "TYPED" "RENAME"))))
-
-(defconst fuel-syntax--alias-definition-regex
-  "^ALIAS: +\\(\\_<.+?\\_>\\) +\\(\\_<.+?\\_>\\)")
-
-(defconst fuel-syntax--vocab-ref-regexp
-  (fuel-syntax--second-word-regex
-   '("IN:" "USE:" "FROM:" "EXCLUDE:" "QUALIFIED:" "QUALIFIED-WITH:")))
-
-(defconst fuel-syntax--int-constant-def-regex
-  (fuel-syntax--second-word-regex '("ALIEN:" "CHAR:" "BIN:" "HEX:" "OCT:")))
-
-(defconst fuel-syntax--type-definition-regex
-  (fuel-syntax--second-word-regex
-   '("C-STRUCT:" "C-UNION:" "MIXIN:" "TUPLE:" "SINGLETON:" "SPECIALIZED-ARRAY:" "STRUCT:" "UNION:")))
-
-(defconst fuel-syntax--tuple-decl-regex
-  "^TUPLE: +\\([^ \n]+\\) +< +\\([^ \n]+\\)\\_>")
-
-(defconst fuel-syntax--constructor-regex "<[^ >]+>")
-
-(defconst fuel-syntax--getter-regex "\\(^\\|\\_<\\)[^ ]+?>>\\_>")
-(defconst fuel-syntax--setter-regex "\\_<>>.+?\\_>")
-
-(defconst fuel-syntax--symbol-definition-regex
-  (fuel-syntax--second-word-regex '("&:" "SYMBOL:" "VAR:")))
-
-(defconst fuel-syntax--stack-effect-regex
-  "\\( ( [^\n]* )\\)\\|\\( (( [^\n]* ))\\)")
-
-(defconst fuel-syntax--using-lines-regex "^USING: +\\([^;]+\\);")
-
-(defconst fuel-syntax--use-line-regex "^USE: +\\(.*\\)$")
-
-(defconst fuel-syntax--current-vocab-regex "^IN: +\\([^ \r\n\f]+\\)")
-
-(defconst fuel-syntax--sub-vocab-regex "^<\\([^ \n]+\\) *$")
-
-(defconst fuel-syntax--alien-function-regex
-  "\\_<FUNCTION: \\(\\w+\\) \\(\\w+\\)")
-
-(defconst fuel-syntax--alien-callback-regex
-  "\\_<CALLBACK: \\(\\w+\\) \\(\\w+\\)")
-
-(defconst fuel-syntax--indent-def-starts '("" ":"
-                                           "C-ENUM" "C-STRUCT" "C-UNION"
-                                           "FROM" "FUNCTION:"
-                                           "INTERSECTION:"
-                                           "M" "M:" "MACRO" "MACRO:"
-                                           "MEMO" "MEMO:" "METHOD"
-                                           "SYNTAX"
-                                           "PREDICATE" "PRIMITIVE"
-                                           "STRUCT" "TAG" "TUPLE"
-                                           "TYPED" "TYPED:"
-                                           "UNIFORM-TUPLE"
-                                           "UNION-STRUCT" "UNION"
-                                           "VERTEX-FORMAT"))
-
-(defconst fuel-syntax--no-indent-def-starts '("ARTICLE"
-                                              "HELP"
-                                              "SINGLETONS"
-                                              "SPECIALIZED-ARRAYS"
-                                              "SYMBOLS"
-                                              "VARS"))
-
-(defconst fuel-syntax--indent-def-start-regex
-  (format "^\\(%s:\\)\\( \\|\n\\)" (regexp-opt fuel-syntax--indent-def-starts)))
-
-(defconst fuel-syntax--definition-start-regex
-  (format "^\\(%s:\\) " (regexp-opt (append fuel-syntax--no-indent-def-starts
-                                            fuel-syntax--indent-def-starts))))
-
-(defconst fuel-syntax--definition-end-regex
-  (format "\\(\\(^\\| +\\);\\( *%s\\)*\\($\\| +\\)\\)"
-          fuel-syntax--declaration-words-regex))
-
-(defconst fuel-syntax--single-liner-regex
-  (regexp-opt '("ABOUT:"
-                "ALIAS:"
-                "CONSTANT:" "C:" "C-TYPE:"
-                "DEFER:"
-                "FORGET:"
-                "GAME:" "GENERIC:" "GENERIC#" "GLSL-PROGRAM:" 
-                "HEX:" "HOOK:"
-                "IN:" "INSTANCE:"
-                "LIBRARY:"
-                "MAIN:" "MATH:" "MIXIN:"
-                "OCT:"
-                "POSTPONE:" "PRIVATE>" "<PRIVATE"
-                "QUALIFIED-WITH:" "QUALIFIED:"
-                "RENAME:"
-                "SINGLETON:" "SLOT:" "SPECIALIZED-ARRAY:" "SYMBOL:"
-                "TYPEDEF:"
-                "USE:"
-                "VAR:")))
-
-(defconst fuel-syntax--begin-of-def-regex
-  (format "^USING: \\|\\(%s\\)\\|\\(^%s .*\\)"
-          fuel-syntax--definition-start-regex
-          fuel-syntax--single-liner-regex))
-
-(defconst fuel-syntax--end-of-def-line-regex
-  (format "^.*%s" fuel-syntax--definition-end-regex))
-
-(defconst fuel-syntax--end-of-def-regex
-  (format "\\(%s\\)\\|\\(^%s .*\\)"
-          fuel-syntax--end-of-def-line-regex
-          fuel-syntax--single-liner-regex))
-
-(defconst fuel-syntax--word-signature-regex
-  (format ":[^ ]* \\([^ ]+\\)\\(%s\\)*" fuel-syntax--stack-effect-regex))
-
-(defconst fuel-syntax--defun-signature-regex
-  (format "\\(%s\\|%s\\)"
-          fuel-syntax--word-signature-regex
-          "M[^:]*: [^ ]+ [^ ]+"))
-
-(defconst fuel-syntax--constructor-decl-regex
-  "\\_<C: +\\(\\w+\\) +\\(\\w+\\)\\( .*\\)?$")
-
-(defconst fuel-syntax--typedef-regex
-  "\\_<TYPEDEF: +\\(\\w+\\) +\\(\\w+\\)\\( .*\\)?$")
-
-(defconst fuel-syntax--rename-regex
-  "\\_<RENAME: +\\(\\w+\\) +\\(\\w+\\) +=> +\\(\\w+\\)\\( .*\\)?$")
-
-\f
-;;; Factor syntax table
-
-(setq fuel-syntax--syntax-table
-  (let ((table (make-syntax-table)))
-    ;; Default is word constituent
-    (dotimes (i 256)
-      (modify-syntax-entry i "w" table))
-    ;; Whitespace (TAB is not whitespace)
-    (modify-syntax-entry ?\f " " table)
-    (modify-syntax-entry ?\r " " table)
-    (modify-syntax-entry ?\  " " table)
-    (modify-syntax-entry ?\n " " table)
-    table))
-
-(defconst fuel-syntax--syntactic-keywords
-  `(;; Strings and chars
-    ("\\_<<\\(\"\\)\\_>" (1 "<b"))
-    ("\\_<\\(\"\\)>\\_>" (1 ">b"))
-    ("\\( \\|^\\)\\(DLL\\|P\\|SBUF\\)?\\(\"\\)\\(\\([^\n\r\f\"\\]\\|\\\\.\\)*\\)\\(\"\\)"
-     (3 "\"") (6 "\""))
-    ("CHAR: \\(\"\\) [^\\\"]*?\\(\"\\)\\([^\\\"]\\|\\\\.\\)*?\\(\"\\)"
-     (1 "w") (2 "<b") (4 ">b"))
-    ("\\(CHAR:\\|\\\\\\) \\(\\w\\|!\\)\\( \\|$\\)" (2 "w"))
-    ;; Comments
-    ("\\_<\\(#?!\\) .*\\(\n\\|$\\)" (1 "<") (2 ">"))
-    ("\\_<\\(#?!\\)\\(\n\\|$\\)" (1 "<") (2 ">"))
-    ;; postpone
-    ("\\_<POSTPONE:\\( \\).*\\(\n\\)" (1 "<b") (2 ">b"))
-    ;; Multiline constructs
-    ("\\_<\\(E\\)BNF:\\( \\|\n\\)" (1 "<b"))
-    ("\\_<;EBN\\(F\\)\\_>" (1 ">b"))
-    ("\\_<\\(U\\)SING: \\(;\\)" (1 "<b") (2 ">b"))
-    ("\\_<USING:\\( \\)" (1 "<b"))
-    ("\\_<\\(C\\)-ENUM: \\(;\\)" (1 "<b") (2 ">b"))
-    ("\\_<C-ENUM:\\( \\|\n\\)" (1 "<b"))
-    ("\\_<TUPLE: +\\w+? +< +\\w+? *\\( \\|\n\\)\\([^;]\\|$\\)" (1 "<b"))
-    ("\\_<TUPLE: +\\w+? *\\( \\|\n\\)\\([^;<\n]\\|\\_>\\)" (1 "<b"))
-    ("\\_<\\(SYMBOLS\\|VARS\\|SPECIALIZED-ARRAYS\\|SINGLETONS\\): *?\\( \\|\n\\)\\([^;\n]\\|\\_>\\)"
-     (2 "<b"))
-    ("\\(\n\\| \\);\\_>" (1 ">b"))
-    ;; Let and lambda:
-    ("\\_<\\(!(\\) .* \\()\\)" (1 "<") (2 ">"))
-    ("\\(\\[\\)\\(let\\|let\\*\\)\\( \\|$\\)" (1 "(]"))
-    ("\\(\\[\\)\\(|\\) +[^|]* \\(|\\)" (1 "(]") (2 "(|") (3 ")|"))
-    (" \\(|\\) " (1 "(|"))
-    (" \\(|\\)$" (1 ")"))
-    ;; Opening brace words:
-    ("\\_<\\w*\\({\\)\\_>" (1 "(}"))
-    ("\\_<\\(}\\)\\_>" (1 "){"))
-    ;; Parenthesis:
-    ("\\_<\\((\\)\\_>" (1 "()"))
-    ("\\_<\\w*\\((\\)\\_>" (1 "()"))
-    ("\\_<\\()\\)\\_>" (1 ")("))
-    ("\\_<(\\((\\)\\_>" (1 "()"))
-    ("\\_<\\()\\))\\_>" (1 ")("))
-    ;; Quotations:
-    ("\\_<'\\(\\[\\)\\_>" (1 "(]"))      ; fried
-    ("\\_<$\\(\\[\\)\\_>" (1 "(]"))      ; parse-time
-    ("\\_<\\(\\[\\)\\_>" (1 "(]"))
-    ("\\_<\\(\\]\\)\\_>" (1 ")["))))
-
-\f
-;;; Source code analysis:
-
-(defsubst fuel-syntax--brackets-depth ()
-  (nth 0 (syntax-ppss)))
-
-(defsubst fuel-syntax--brackets-start ()
-  (nth 1 (syntax-ppss)))
-
-(defun fuel-syntax--brackets-end ()
-  (save-excursion
-    (goto-char (fuel-syntax--brackets-start))
-    (condition-case nil
-        (progn (forward-sexp)
-               (1- (point)))
-      (error -1))))
-
-(defsubst fuel-syntax--indentation-at (pos)
-  (save-excursion (goto-char pos) (current-indentation)))
-
-(defsubst fuel-syntax--increased-indentation (&optional i)
-  (+ (or i (current-indentation)) factor-indent-width))
-(defsubst fuel-syntax--decreased-indentation (&optional i)
-  (- (or i (current-indentation)) factor-indent-width))
-
-(defsubst fuel-syntax--at-begin-of-def ()
-  (looking-at fuel-syntax--begin-of-def-regex))
-
-(defsubst fuel-syntax--at-begin-of-indent-def ()
-  (looking-at fuel-syntax--indent-def-start-regex))
-
-(defsubst fuel-syntax--at-end-of-def ()
-  (looking-at fuel-syntax--end-of-def-regex))
-
-(defsubst fuel-syntax--looking-at-emptiness ()
-  (looking-at "^[ ]*$\\|$"))
-
-(defsubst fuel-syntax--is-last-char (pos)
-  (save-excursion
-    (goto-char (1+ pos))
-    (looking-at-p "[ ]*$")))
-
-(defsubst fuel-syntax--line-offset (pos)
-  (- pos (save-excursion
-           (goto-char pos)
-           (beginning-of-line)
-           (point))))
-
-(defun fuel-syntax--previous-non-blank ()
-  (forward-line -1)
-  (while (and (not (bobp)) (fuel-syntax--looking-at-emptiness))
-    (forward-line -1)))
-
-(defun fuel-syntax--beginning-of-block-pos ()
-  (save-excursion
-    (if (> (fuel-syntax--brackets-depth) 0)
-        (fuel-syntax--brackets-start)
-      (fuel-syntax--beginning-of-defun)
-      (point))))
-
-(defun fuel-syntax--at-setter-line ()
-  (save-excursion
-    (beginning-of-line)
-    (when (re-search-forward fuel-syntax--setter-regex
-                             (line-end-position)
-                             t)
-      (let* ((to (match-beginning 0))
-             (from (fuel-syntax--beginning-of-block-pos)))
-        (goto-char from)
-        (let ((depth (fuel-syntax--brackets-depth)))
-          (and (or (re-search-forward fuel-syntax--constructor-regex to t)
-                   (re-search-forward fuel-syntax--setter-regex to t))
-               (= depth (fuel-syntax--brackets-depth))))))))
-
-(defun fuel-syntax--at-constructor-line ()
-  (save-excursion
-    (beginning-of-line)
-    (re-search-forward fuel-syntax--constructor-regex (line-end-position) t)))
-
-(defsubst fuel-syntax--at-using ()
-  (looking-at fuel-syntax--using-lines-regex))
-
-(defun fuel-syntax--in-using ()
-  (let ((p (point)))
-    (save-excursion
-      (and (re-search-backward "^USING: " nil t)
-           (re-search-forward " ;" nil t)
-           (< p (match-end 0))))))
-
-(defsubst fuel-syntax--beginning-of-defun (&optional times)
-  (re-search-backward fuel-syntax--begin-of-def-regex nil t times))
-
-(defsubst fuel-syntax--end-of-defun ()
-  (re-search-forward fuel-syntax--end-of-def-regex nil t))
-
-(defsubst fuel-syntax--end-of-defun-pos ()
-  (save-excursion
-    (re-search-forward fuel-syntax--end-of-def-regex nil t)
-    (point)))
-
-(defun fuel-syntax--beginning-of-body ()
-  (let ((p (point)))
-    (and (fuel-syntax--beginning-of-defun)
-         (re-search-forward fuel-syntax--defun-signature-regex p t)
-         (not (re-search-forward fuel-syntax--end-of-def-regex p t)))))
-
-(defun fuel-syntax--beginning-of-sexp ()
-  (if (> (fuel-syntax--brackets-depth) 0)
-      (goto-char (fuel-syntax--brackets-start))
-    (fuel-syntax--beginning-of-body)))
-
-(defsubst fuel-syntax--beginning-of-sexp-pos ()
-  (save-excursion (fuel-syntax--beginning-of-sexp) (point)))
-
-\f
-;;; USING/IN:
-
-(make-variable-buffer-local
- (defvar fuel-syntax--current-vocab-function 'fuel-syntax--find-in))
-
-(defsubst fuel-syntax--current-vocab ()
-  (funcall fuel-syntax--current-vocab-function))
-
-(defun fuel-syntax--find-in ()
-  (save-excursion
-    (when (re-search-backward fuel-syntax--current-vocab-regex nil t)
-      (match-string-no-properties 1))))
-
-(make-variable-buffer-local
- (defvar fuel-syntax--usings-function 'fuel-syntax--find-usings))
-
-(defsubst fuel-syntax--usings ()
-  (funcall fuel-syntax--usings-function))
-
-(defun fuel-syntax--file-has-private ()
-  (save-excursion
-    (goto-char (point-min))
-    (and (re-search-forward "\\_<<PRIVATE\\_>" nil t)
-         (re-search-forward "\\_<PRIVATE>\\_>" nil t))))
-
-(defun fuel-syntax--find-usings (&optional no-private)
-  (save-excursion
-    (let ((usings))
-      (goto-char (point-max))
-      (while (re-search-backward fuel-syntax--using-lines-regex nil t)
-        (dolist (u (split-string (match-string-no-properties 1) nil t))
-          (push u usings)))
-      (when (and (not no-private) (fuel-syntax--file-has-private))
-        (goto-char (point-max))
-        (push (concat (fuel-syntax--find-in) ".private") usings))
-      usings)))
-
-\f
-(provide 'fuel-syntax)
-;;; fuel-syntax.el ends here
+;;; fuel-syntax.el --- auxiliar definitions for factor code navigation.\r
+\r
+;; Copyright (C) 2008, 2009  Jose Antonio Ortega Ruiz\r
+;; See http://factorcode.org/license.txt for BSD license.\r
+\r
+;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>\r
+;; Keywords: languages\r
+\r
+;;; Commentary:\r
+\r
+;; Auxiliar constants and functions to parse factor code.\r
+\r
+;;; Code:\r
+\r
+(require 'thingatpt)\r
+\r
+\f\r
+;;; Thing-at-point support for factor symbols:\r
+\r
+(defun fuel-syntax--beginning-of-symbol ()\r
+  "Move point to the beginning of the current symbol."\r
+  (skip-syntax-backward "w_()"))\r
+\r
+(defsubst fuel-syntax--beginning-of-symbol-pos ()\r
+  (save-excursion (fuel-syntax--beginning-of-symbol) (point)))\r
+\r
+(defun fuel-syntax--end-of-symbol ()\r
+  "Move point to the end of the current symbol."\r
+  (skip-syntax-forward "w_()"))\r
+\r
+(defsubst fuel-syntax--end-of-symbol-pos ()\r
+  (save-excursion (fuel-syntax--end-of-symbol) (point)))\r
+\r
+(put 'factor-symbol 'end-op 'fuel-syntax--end-of-symbol)\r
+(put 'factor-symbol 'beginning-op 'fuel-syntax--beginning-of-symbol)\r
+\r
+(defsubst fuel-syntax-symbol-at-point ()\r
+  (let ((s (substring-no-properties (thing-at-point 'factor-symbol))))\r
+    (and (> (length s) 0) s)))\r
+\r
+\r
+\f\r
+;;; Regexps galore:\r
+\r
+(defconst fuel-syntax--parsing-words\r
+  '(":" "::" ";" "&:" "<<" "<PRIVATE" ">>"\r
+    "ABOUT:" "ALIAS:" "ALIEN:" "ARTICLE:"\r
+    "B" "BIN:"\r
+    "C:" "CALLBACK:" "C-ENUM:" "C-STRUCT:" "C-TYPE:" "C-UNION:" "CHAR:" "CONSTANT:" "call-next-method"\r
+    "DEFER:"\r
+    "EBNF:" ";EBNF" "ERROR:" "EXCLUDE:"\r
+    "f" "FORGET:" "FROM:" "FUNCTION:"\r
+    "GAME:" "GENERIC#" "GENERIC:"\r
+    "GLSL-SHADER:" "GLSL-PROGRAM:"\r
+    "HELP:" "HEX:" "HOOK:"\r
+    "IN:" "initial:" "INSTANCE:" "INTERSECTION:"\r
+    "LIBRARY:"\r
+    "M:" "M::" "MACRO:" "MACRO::" "MAIN:" "MATH:"\r
+    "MEMO:" "MEMO:" "METHOD:" "MIXIN:"\r
+    "OCT:"\r
+    "POSTPONE:" "PREDICATE:" "PRIMITIVE:" "PRIVATE>" "PROVIDE:"\r
+    "QUALIFIED-WITH:" "QUALIFIED:"\r
+    "read-only" "RENAME:" "REQUIRE:"  "REQUIRES:"\r
+    "SINGLETON:" "SINGLETONS:" "SLOT:" "SPECIALIZED-ARRAY:" "SPECIALIZED-ARRAYS:" "STRING:" "STRUCT:" "SYMBOL:" "SYMBOLS:" "SYNTAX:"\r
+    "TUPLE:" "t" "t?" "TYPEDEF:" "TYPED:" "TYPED::"\r
+    "UNIFORM-TUPLE:" "UNION:" "UNION-STRUCT:" "USE:" "USING:"\r
+    "VARS:" "VERTEX-FORMAT:"))\r
+\r
+(defconst fuel-syntax--parsing-words-regex\r
+  (regexp-opt fuel-syntax--parsing-words 'words))\r
+\r
+(defconst fuel-syntax--bracers\r
+  '("B" "BV" "C" "CS" "H" "T" "V" "W"))\r
+\r
+(defconst fuel-syntax--brace-words-regex\r
+  (format "%s{" (regexp-opt fuel-syntax--bracers t)))\r
+\r
+(defconst fuel-syntax--declaration-words\r
+  '("flushable" "foldable" "inline" "parsing" "recursive" "delimiter"))\r
+\r
+(defconst fuel-syntax--declaration-words-regex\r
+  (regexp-opt fuel-syntax--declaration-words 'words))\r
+\r
+(defsubst fuel-syntax--second-word-regex (prefixes)\r
+  (format "%s +\\([^ \r\n]+\\)" (regexp-opt prefixes t)))\r
+\r
+(defconst fuel-syntax--method-definition-regex\r
+  "^M::? +\\([^ ]+\\) +\\([^ ]+\\)")\r
+\r
+(defconst fuel-syntax--integer-regex\r
+  "\\_<-?[0-9]+\\_>")\r
+\r
+(defconst fuel-syntax--raw-float-regex\r
+  "[0-9]*\\.[0-9]*\\([eE][+-]?[0-9]+\\)?")\r
+\r
+(defconst fuel-syntax--float-regex\r
+  (format "\\_<-?%s\\_>" fuel-syntax--raw-float-regex))\r
+\r
+(defconst fuel-syntax--number-regex\r
+  (format "\\([0-9]+\\|%s\\)" fuel-syntax--raw-float-regex))\r
+\r
+(defconst fuel-syntax--ratio-regex\r
+  (format "\\_<[+-]?%s/-?%s\\_>"\r
+          fuel-syntax--number-regex\r
+          fuel-syntax--number-regex))\r
+\r
+(defconst fuel-syntax--bad-string-regex\r
+  "\\_<\"[^>]\\([^\"\n]\\|\\\\\"\\)*\n")\r
+\r
+(defconst fuel-syntax--word-definition-regex\r
+  (format "\\_<\\(%s\\)?: +\\_<\\(\\w+\\)\\_>"\r
+          (regexp-opt\r
+           '(":" "GENERIC" "DEFER" "HOOK" "MAIN" "MATH" "POSTPONE"\r
+             "SYMBOL" "SYNTAX" "TYPED" "RENAME"))))\r
+\r
+(defconst fuel-syntax--alias-definition-regex\r
+  "^ALIAS: +\\(\\_<.+?\\_>\\) +\\(\\_<.+?\\_>\\)")\r
+\r
+(defconst fuel-syntax--vocab-ref-regexp\r
+  (fuel-syntax--second-word-regex\r
+   '("IN:" "USE:" "FROM:" "EXCLUDE:" "QUALIFIED:" "QUALIFIED-WITH:")))\r
+\r
+(defconst fuel-syntax--int-constant-def-regex\r
+  (fuel-syntax--second-word-regex '("ALIEN:" "CHAR:" "BIN:" "HEX:" "OCT:")))\r
+\r
+(defconst fuel-syntax--type-definition-regex\r
+  (fuel-syntax--second-word-regex\r
+   '("C-STRUCT:" "C-UNION:" "MIXIN:" "TUPLE:" "SINGLETON:" "SPECIALIZED-ARRAY:" "STRUCT:" "UNION:" "UNION-STRUCT:")))\r
+\r
+(defconst fuel-syntax--tuple-decl-regex\r
+  "^TUPLE: +\\([^ \n]+\\) +< +\\([^ \n]+\\)\\_>")\r
+\r
+(defconst fuel-syntax--constructor-regex "<[^ >]+>")\r
+\r
+(defconst fuel-syntax--getter-regex "\\(^\\|\\_<\\)[^ ]+?>>\\_>")\r
+(defconst fuel-syntax--setter-regex "\\_<>>.+?\\_>")\r
+\r
+(defconst fuel-syntax--symbol-definition-regex\r
+  (fuel-syntax--second-word-regex '("&:" "SYMBOL:" "VAR:")))\r
+\r
+(defconst fuel-syntax--stack-effect-regex\r
+  "\\( ( [^\n]* )\\)\\|\\( (( [^\n]* ))\\)")\r
+\r
+(defconst fuel-syntax--using-lines-regex "^USING: +\\([^;]+\\);")\r
+\r
+(defconst fuel-syntax--use-line-regex "^USE: +\\(.*\\)$")\r
+\r
+(defconst fuel-syntax--current-vocab-regex "^IN: +\\([^ \r\n\f]+\\)")\r
+\r
+(defconst fuel-syntax--sub-vocab-regex "^<\\([^ \n]+\\) *$")\r
+\r
+(defconst fuel-syntax--alien-function-regex\r
+  "\\_<FUNCTION: \\(\\w+\\) \\(\\w+\\)")\r
+\r
+(defconst fuel-syntax--alien-callback-regex\r
+  "\\_<CALLBACK: \\(\\w+\\) \\(\\w+\\)")\r
+\r
+(defconst fuel-syntax--indent-def-starts '("" ":"\r
+                                           "C-ENUM" "C-STRUCT" "C-UNION"\r
+                                           "FROM" "FUNCTION:"\r
+                                           "INTERSECTION:"\r
+                                           "M" "M:" "MACRO" "MACRO:"\r
+                                           "MEMO" "MEMO:" "METHOD"\r
+                                           "SYNTAX"\r
+                                           "PREDICATE" "PRIMITIVE"\r
+                                           "STRUCT" "TAG" "TUPLE"\r
+                                           "TYPED" "TYPED:"\r
+                                           "UNIFORM-TUPLE"\r
+                                           "UNION-STRUCT" "UNION"\r
+                                           "VERTEX-FORMAT"))\r
+\r
+(defconst fuel-syntax--no-indent-def-starts '("ARTICLE"\r
+                                              "HELP"\r
+                                              "SINGLETONS"\r
+                                              "SPECIALIZED-ARRAYS"\r
+                                              "SYMBOLS"\r
+                                              "VARS"))\r
+\r
+(defconst fuel-syntax--indent-def-start-regex\r
+  (format "^\\(%s:\\)\\( \\|\n\\)" (regexp-opt fuel-syntax--indent-def-starts)))\r
+\r
+(defconst fuel-syntax--definition-start-regex\r
+  (format "^\\(%s:\\) " (regexp-opt (append fuel-syntax--no-indent-def-starts\r
+                                            fuel-syntax--indent-def-starts))))\r
+\r
+(defconst fuel-syntax--definition-end-regex\r
+  (format "\\(\\(^\\| +\\);\\( *%s\\)*\\($\\| +\\)\\)"\r
+          fuel-syntax--declaration-words-regex))\r
+\r
+(defconst fuel-syntax--single-liner-regex\r
+  (regexp-opt '("ABOUT:"\r
+                "ALIAS:"\r
+                "CONSTANT:" "C:" "C-TYPE:"\r
+                "DEFER:"\r
+                "FORGET:"\r
+                "GAME:" "GENERIC:" "GENERIC#" "GLSL-PROGRAM:" \r
+                "HEX:" "HOOK:"\r
+                "IN:" "INSTANCE:"\r
+                "LIBRARY:"\r
+                "MAIN:" "MATH:" "MIXIN:"\r
+                "OCT:"\r
+                "POSTPONE:" "PRIVATE>" "<PRIVATE"\r
+                "QUALIFIED-WITH:" "QUALIFIED:"\r
+                "RENAME:"\r
+                "SINGLETON:" "SLOT:" "SPECIALIZED-ARRAY:" "SYMBOL:"\r
+                "TYPEDEF:"\r
+                "USE:"\r
+                "VAR:")))\r
+\r
+(defconst fuel-syntax--begin-of-def-regex\r
+  (format "^USING: \\|\\(%s\\)\\|\\(^%s .*\\)"\r
+          fuel-syntax--definition-start-regex\r
+          fuel-syntax--single-liner-regex))\r
+\r
+(defconst fuel-syntax--end-of-def-line-regex\r
+  (format "^.*%s" fuel-syntax--definition-end-regex))\r
+\r
+(defconst fuel-syntax--end-of-def-regex\r
+  (format "\\(%s\\)\\|\\(^%s .*\\)"\r
+          fuel-syntax--end-of-def-line-regex\r
+          fuel-syntax--single-liner-regex))\r
+\r
+(defconst fuel-syntax--word-signature-regex\r
+  (format ":[^ ]* \\([^ ]+\\)\\(%s\\)*" fuel-syntax--stack-effect-regex))\r
+\r
+(defconst fuel-syntax--defun-signature-regex\r
+  (format "\\(%s\\|%s\\)"\r
+          fuel-syntax--word-signature-regex\r
+          "M[^:]*: [^ ]+ [^ ]+"))\r
+\r
+(defconst fuel-syntax--constructor-decl-regex\r
+  "\\_<C: +\\(\\w+\\) +\\(\\w+\\)\\( .*\\)?$")\r
+\r
+(defconst fuel-syntax--typedef-regex\r
+  "\\_<TYPEDEF: +\\(\\w+\\) +\\(\\w+\\)\\( .*\\)?$")\r
+\r
+(defconst fuel-syntax--rename-regex\r
+  "\\_<RENAME: +\\(\\w+\\) +\\(\\w+\\) +=> +\\(\\w+\\)\\( .*\\)?$")\r
+\r
+\f\r
+;;; Factor syntax table\r
+\r
+(setq fuel-syntax--syntax-table\r
+  (let ((table (make-syntax-table)))\r
+    ;; Default is word constituent\r
+    (dotimes (i 256)\r
+      (modify-syntax-entry i "w" table))\r
+    ;; Whitespace (TAB is not whitespace)\r
+    (modify-syntax-entry ?\f " " table)\r
+    (modify-syntax-entry ?\r " " table)\r
+    (modify-syntax-entry ?\  " " table)\r
+    (modify-syntax-entry ?\n " " table)\r
+    table))\r
+\r
+(defconst fuel-syntax--syntactic-keywords\r
+  `(;; Strings and chars\r
+    ("\\_<<\\(\"\\)\\_>" (1 "<b"))\r
+    ("\\_<\\(\"\\)>\\_>" (1 ">b"))\r
+    ("\\( \\|^\\)\\(DLL\\|P\\|SBUF\\)?\\(\"\\)\\(\\([^\n\r\f\"\\]\\|\\\\.\\)*\\)\\(\"\\)"\r
+     (3 "\"") (6 "\""))\r
+    ("CHAR: \\(\"\\) [^\\\"]*?\\(\"\\)\\([^\\\"]\\|\\\\.\\)*?\\(\"\\)"\r
+     (1 "w") (2 "<b") (4 ">b"))\r
+    ("\\(CHAR:\\|\\\\\\) \\(\\w\\|!\\)\\( \\|$\\)" (2 "w"))\r
+    ;; Comments\r
+    ("\\_<\\(#?!\\) .*\\(\n\\|$\\)" (1 "<") (2 ">"))\r
+    ("\\_<\\(#?!\\)\\(\n\\|$\\)" (1 "<") (2 ">"))\r
+    ;; postpone\r
+    ("\\_<POSTPONE:\\( \\).*\\(\n\\)" (1 "<b") (2 ">b"))\r
+    ;; Multiline constructs\r
+    ("\\_<\\(E\\)BNF:\\( \\|\n\\)" (1 "<b"))\r
+    ("\\_<;EBN\\(F\\)\\_>" (1 ">b"))\r
+    ("\\_<\\(U\\)SING: \\(;\\)" (1 "<b") (2 ">b"))\r
+    ("\\_<USING:\\( \\)" (1 "<b"))\r
+    ("\\_<\\(C\\)-ENUM: \\(;\\)" (1 "<b") (2 ">b"))\r
+    ("\\_<C-ENUM:\\( \\|\n\\)" (1 "<b"))\r
+    ("\\_<TUPLE: +\\w+? +< +\\w+? *\\( \\|\n\\)\\([^;]\\|$\\)" (1 "<b"))\r
+    ("\\_<TUPLE: +\\w+? *\\( \\|\n\\)\\([^;<\n]\\|\\_>\\)" (1 "<b"))\r
+    ("\\_<\\(SYMBOLS\\|VARS\\|SPECIALIZED-ARRAYS\\|SINGLETONS\\): *?\\( \\|\n\\)\\([^;\n]\\|\\_>\\)"\r
+     (2 "<b"))\r
+    ("\\(\n\\| \\);\\_>" (1 ">b"))\r
+    ;; Let and lambda:\r
+    ("\\_<\\(!(\\) .* \\()\\)" (1 "<") (2 ">"))\r
+    ("\\(\\[\\)\\(let\\|let\\*\\)\\( \\|$\\)" (1 "(]"))\r
+    ("\\(\\[\\)\\(|\\) +[^|]* \\(|\\)" (1 "(]") (2 "(|") (3 ")|"))\r
+    (" \\(|\\) " (1 "(|"))\r
+    (" \\(|\\)$" (1 ")"))\r
+    ;; Opening brace words:\r
+    ("\\_<\\w*\\({\\)\\_>" (1 "(}"))\r
+    ("\\_<\\(}\\)\\_>" (1 "){"))\r
+    ;; Parenthesis:\r
+    ("\\_<\\((\\)\\_>" (1 "()"))\r
+    ("\\_<\\w*\\((\\)\\_>" (1 "()"))\r
+    ("\\_<\\()\\)\\_>" (1 ")("))\r
+    ("\\_<(\\((\\)\\_>" (1 "()"))\r
+    ("\\_<\\()\\))\\_>" (1 ")("))\r
+    ;; Quotations:\r
+    ("\\_<'\\(\\[\\)\\_>" (1 "(]"))      ; fried\r
+    ("\\_<$\\(\\[\\)\\_>" (1 "(]"))      ; parse-time\r
+    ("\\_<\\(\\[\\)\\_>" (1 "(]"))\r
+    ("\\_<\\(\\]\\)\\_>" (1 ")["))))\r
+\r
+\f\r
+;;; Source code analysis:\r
+\r
+(defsubst fuel-syntax--brackets-depth ()\r
+  (nth 0 (syntax-ppss)))\r
+\r
+(defsubst fuel-syntax--brackets-start ()\r
+  (nth 1 (syntax-ppss)))\r
+\r
+(defun fuel-syntax--brackets-end ()\r
+  (save-excursion\r
+    (goto-char (fuel-syntax--brackets-start))\r
+    (condition-case nil\r
+        (progn (forward-sexp)\r
+               (1- (point)))\r
+      (error -1))))\r
+\r
+(defsubst fuel-syntax--indentation-at (pos)\r
+  (save-excursion (goto-char pos) (current-indentation)))\r
+\r
+(defsubst fuel-syntax--increased-indentation (&optional i)\r
+  (+ (or i (current-indentation)) factor-indent-width))\r
+(defsubst fuel-syntax--decreased-indentation (&optional i)\r
+  (- (or i (current-indentation)) factor-indent-width))\r
+\r
+(defsubst fuel-syntax--at-begin-of-def ()\r
+  (looking-at fuel-syntax--begin-of-def-regex))\r
+\r
+(defsubst fuel-syntax--at-begin-of-indent-def ()\r
+  (looking-at fuel-syntax--indent-def-start-regex))\r
+\r
+(defsubst fuel-syntax--at-end-of-def ()\r
+  (looking-at fuel-syntax--end-of-def-regex))\r
+\r
+(defsubst fuel-syntax--looking-at-emptiness ()\r
+  (looking-at "^[ ]*$\\|$"))\r
+\r
+(defsubst fuel-syntax--is-last-char (pos)\r
+  (save-excursion\r
+    (goto-char (1+ pos))\r
+    (looking-at-p "[ ]*$")))\r
+\r
+(defsubst fuel-syntax--line-offset (pos)\r
+  (- pos (save-excursion\r
+           (goto-char pos)\r
+           (beginning-of-line)\r
+           (point))))\r
+\r
+(defun fuel-syntax--previous-non-blank ()\r
+  (forward-line -1)\r
+  (while (and (not (bobp)) (fuel-syntax--looking-at-emptiness))\r
+    (forward-line -1)))\r
+\r
+(defun fuel-syntax--beginning-of-block-pos ()\r
+  (save-excursion\r
+    (if (> (fuel-syntax--brackets-depth) 0)\r
+        (fuel-syntax--brackets-start)\r
+      (fuel-syntax--beginning-of-defun)\r
+      (point))))\r
+\r
+(defun fuel-syntax--at-setter-line ()\r
+  (save-excursion\r
+    (beginning-of-line)\r
+    (when (re-search-forward fuel-syntax--setter-regex\r
+                             (line-end-position)\r
+                             t)\r
+      (let* ((to (match-beginning 0))\r
+             (from (fuel-syntax--beginning-of-block-pos)))\r
+        (goto-char from)\r
+        (let ((depth (fuel-syntax--brackets-depth)))\r
+          (and (or (re-search-forward fuel-syntax--constructor-regex to t)\r
+                   (re-search-forward fuel-syntax--setter-regex to t))\r
+               (= depth (fuel-syntax--brackets-depth))))))))\r
+\r
+(defun fuel-syntax--at-constructor-line ()\r
+  (save-excursion\r
+    (beginning-of-line)\r
+    (re-search-forward fuel-syntax--constructor-regex (line-end-position) t)))\r
+\r
+(defsubst fuel-syntax--at-using ()\r
+  (looking-at fuel-syntax--using-lines-regex))\r
+\r
+(defun fuel-syntax--in-using ()\r
+  (let ((p (point)))\r
+    (save-excursion\r
+      (and (re-search-backward "^USING: " nil t)\r
+           (re-search-forward " ;" nil t)\r
+           (< p (match-end 0))))))\r
+\r
+(defsubst fuel-syntax--beginning-of-defun (&optional times)\r
+  (re-search-backward fuel-syntax--begin-of-def-regex nil t times))\r
+\r
+(defsubst fuel-syntax--end-of-defun ()\r
+  (re-search-forward fuel-syntax--end-of-def-regex nil t))\r
+\r
+(defsubst fuel-syntax--end-of-defun-pos ()\r
+  (save-excursion\r
+    (re-search-forward fuel-syntax--end-of-def-regex nil t)\r
+    (point)))\r
+\r
+(defun fuel-syntax--beginning-of-body ()\r
+  (let ((p (point)))\r
+    (and (fuel-syntax--beginning-of-defun)\r
+         (re-search-forward fuel-syntax--defun-signature-regex p t)\r
+         (not (re-search-forward fuel-syntax--end-of-def-regex p t)))))\r
+\r
+(defun fuel-syntax--beginning-of-sexp ()\r
+  (if (> (fuel-syntax--brackets-depth) 0)\r
+      (goto-char (fuel-syntax--brackets-start))\r
+    (fuel-syntax--beginning-of-body)))\r
+\r
+(defsubst fuel-syntax--beginning-of-sexp-pos ()\r
+  (save-excursion (fuel-syntax--beginning-of-sexp) (point)))\r
+\r
+\f\r
+;;; USING/IN:\r
+\r
+(make-variable-buffer-local\r
+ (defvar fuel-syntax--current-vocab-function 'fuel-syntax--find-in))\r
+\r
+(defsubst fuel-syntax--current-vocab ()\r
+  (funcall fuel-syntax--current-vocab-function))\r
+\r
+(defun fuel-syntax--find-in ()\r
+  (save-excursion\r
+    (when (re-search-backward fuel-syntax--current-vocab-regex nil t)\r
+      (match-string-no-properties 1))))\r
+\r
+(make-variable-buffer-local\r
+ (defvar fuel-syntax--usings-function 'fuel-syntax--find-usings))\r
+\r
+(defsubst fuel-syntax--usings ()\r
+  (funcall fuel-syntax--usings-function))\r
+\r
+(defun fuel-syntax--file-has-private ()\r
+  (save-excursion\r
+    (goto-char (point-min))\r
+    (and (re-search-forward "\\_<<PRIVATE\\_>" nil t)\r
+         (re-search-forward "\\_<PRIVATE>\\_>" nil t))))\r
+\r
+(defun fuel-syntax--find-usings (&optional no-private)\r
+  (save-excursion\r
+    (let ((usings))\r
+      (goto-char (point-max))\r
+      (while (re-search-backward fuel-syntax--using-lines-regex nil t)\r
+        (dolist (u (split-string (match-string-no-properties 1) nil t))\r
+          (push u usings)))\r
+      (when (and (not no-private) (fuel-syntax--file-has-private))\r
+        (goto-char (point-max))\r
+        (push (concat (fuel-syntax--find-in) ".private") usings))\r
+      usings)))\r
+\r
+\f\r
+(provide 'fuel-syntax)\r
+;;; fuel-syntax.el ends here\r