[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/haskell-tng-mode 0c5acb7 087/385: lexer and grammar suppor
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/haskell-tng-mode 0c5acb7 087/385: lexer and grammar supports symid |
Date: |
Tue, 5 Oct 2021 23:59:07 -0400 (EDT) |
branch: elpa/haskell-tng-mode
commit 0c5acb7595beaf841071436583adfca25d77e940
Author: Tseen She <ts33n.sh3@gmail.com>
Commit: Tseen She <ts33n.sh3@gmail.com>
lexer and grammar supports symid
---
haskell-tng-font-lock.el | 74 ++++++++++-------------------------------------
haskell-tng-lexer.el | 48 ++++++++++++++++++------------
haskell-tng-rx.el | 68 +++++++++++++++++++++++++++++++++++++++++++
haskell-tng-smie.el | 9 ++----
haskell-tng-syntax.el | 29 ++++++++++---------
test/src/grammar.hs.sexps | 6 ++--
test/src/layout.hs.lexer | 2 +-
test/src/layout.hs.sexps | 12 ++++----
test/src/medley.hs | 2 ++
test/src/medley.hs.faceup | 2 ++
test/src/medley.hs.layout | 2 ++
test/src/medley.hs.lexer | 42 ++++++++++++++-------------
12 files changed, 168 insertions(+), 128 deletions(-)
diff --git a/haskell-tng-font-lock.el b/haskell-tng-font-lock.el
index da9980f..70b98b5 100644
--- a/haskell-tng-font-lock.el
+++ b/haskell-tng-font-lock.el
@@ -35,6 +35,7 @@
;;; Code:
(require 'dash)
+(require 'haskell-tng-rx)
(require 'haskell-tng-util)
(defgroup haskell-tng:faces nil
@@ -67,50 +68,6 @@
:group 'haskell-tng:faces)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Here are `rx' patterns that are reused as a very simple form of BNF grammar
-(defconst haskell-tng:rx:conid '(: upper (* word)))
-(defconst haskell-tng:rx:varid '(: (any lower ?_) (* (any word ?_ ?\'))))
-(defconst haskell-tng:rx:qual `(: (+ (: ,haskell-tng:rx:conid (char ?.)))))
-(defconst haskell-tng:rx:consym '(: ":" (+ (syntax symbol))))
-;; TODO restrictive consym, e.g. no :: , @
-(defconst haskell-tng:rx:toplevel
- ;; TODO multi-definitions, e.g. Servant's :<|>
- `(: line-start (group (| ,haskell-tng:rx:varid
- (: "(" (+? (syntax symbol)) ")")))
- symbol-end))
-;; note that \n has syntax `comment-end'
-(defconst haskell-tng:rx:newline
- '(| (syntax comment-end)
- (: symbol-start
- "--"
- (+ (not (syntax comment-end)))
- (syntax comment-end)))
- "Newline or line comment.")
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Here are compiled regexps that are reused
-(defconst haskell-tng:regexp:reserved
- (rx (|
- (: word-start
- (| "case" "class" "data" "default" "deriving" "do" "else"
- "foreign" "if" "import" "in" "infix" "infixl"
- "infixr" "instance" "let" "module" "newtype" "of"
- "then" "type" "where" "_")
- word-end)
- (: symbol-start
- (| ".." ":" "::" "=" "|" "<-" "->" "@" "~" "=>")
- symbol-end)
- (: symbol-start (char ?\\))))
- "reservedid / reservedop")
-
-(defconst haskell-tng:regexp:qvarid
- (rx-to-string `(: symbol-start (opt ,haskell-tng:rx:qual)
,haskell-tng:rx:varid symbol-end)))
-(defconst haskell-tng:regexp:qconid
- (rx-to-string `(: symbol-start (opt ,haskell-tng:rx:qual)
,haskell-tng:rx:conid symbol-end)))
-(defconst haskell-tng:regexp:qconsym
- (rx-to-string `(: ,haskell-tng:rx:consym symbol-end)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Here is the `font-lock-keywords' table of matchers and highlighters.
(defvar
haskell-tng:keywords
@@ -118,7 +75,7 @@
;; also increases the readability of the code and, in many cases, allows us
to
;; do more work in a single regexp instead of multiple passes.
(let ((conid haskell-tng:rx:conid)
- (qual haskell-tng:rx:qual)
+ ;;(qual haskell-tng:rx:qual)
(consym haskell-tng:rx:consym)
(toplevel haskell-tng:rx:toplevel)
(bigspace `(| space ,haskell-tng:rx:newline)))
@@ -150,18 +107,18 @@
;; EXT:TypeApplications: It is not easy to disambiguate between type
;; applications and value extractor in a pattern. Needs work.
;; (,(rx-to-string `(: symbol-start "@" (* space)
- ;; (group (opt ,qual) (| ,conid ,consym))))
+ ;; (group (? ,qual) (| ,conid ,consym))))
;; (1 'haskell-tng:type))
;; imports
(haskell-tng:font:import:keyword
(,(rx-to-string
`(: line-start "import" (+ space)
- (group (opt word-start "qualified" word-end)) (* space)
+ (group (? word-start "qualified" word-end)) (* space)
;; EXT:PackageImports
;; EXT:Safe, EXT:Trustworthy, EXT:Unsafe
(group symbol-start (* ,conid ".") ,conid symbol-end) (*
,bigspace)
- (group (opt word-start "hiding" word-end)) (* space)))
+ (group (? word-start "hiding" word-end)) (* space)))
(haskell-tng:font:multiline:anchor-rewind) nil
(1 'haskell-tng:keyword)
(2 'haskell-tng:module)
@@ -232,15 +189,14 @@ If there is no match for GROUP, move to the end of the
line, canceling this ANCH
(defun haskell-tng:font:explicit-constructors (limit)
"Finds paren blocks of constructors when in an import statement.
Some complexity to avoid matching on operators."
- (let ((start (point)))
- (when (re-search-forward
- (rx (any lower) (* space) "(")
- limit t)
- (let ((open (point)))
- (when-let (close (haskell-tng:paren-close))
- (when (<= close limit)
- (goto-char open)
- (re-search-forward (rx (+ anything)) close t)))))))
+ (when (re-search-forward
+ (rx (any lower) (* space) "(")
+ limit t)
+ (let ((open (point)))
+ (when-let (close (haskell-tng:paren-close))
+ (when (<= close limit)
+ (goto-char open)
+ (re-search-forward (rx (+ anything)) close t))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Here are `function' matchers for use in `font-lock-keywords' and
@@ -337,7 +293,7 @@ succeeds and may further restrict the FIND search limit."
(haskell-tng:font:multiline deriving
(rx word-start "deriving" word-end)
(rx word-start "deriving" word-end
- (+ space) (group (opt (| "anyclass" "stock"
"newtype") word-end))
+ (+ space) (group (? (| "anyclass" "stock"
"newtype") word-end))
(* space) ?\( (group (* anything)) ?\))
haskell-tng:indent-close)
@@ -345,7 +301,7 @@ succeeds and may further restrict the FIND search limit."
(rx line-start "import" word-end)
(rx line-start "import" word-end
(+ (not (any ?\( )))
- (opt "(" (group (+ anything))))
+ (? "(" (group (+ anything))))
haskell-tng:indent-close)
(haskell-tng:font:multiline module
diff --git a/haskell-tng-lexer.el b/haskell-tng-lexer.el
index 830f6b2..e5bf3b2 100644
--- a/haskell-tng-lexer.el
+++ b/haskell-tng-lexer.el
@@ -12,7 +12,7 @@
(require 'smie)
-(require 'haskell-tng-font-lock)
+(require 'haskell-tng-rx)
(require 'haskell-tng-layout)
;; The list of virtual tokens that must be played back at point, or `t' to
@@ -81,26 +81,31 @@ the lexer."
;; syntax tables (supported by `smie-indent-forward-token')
((looking-at haskell-tng-lexer:fast-syntax) nil)
+ ;; If this ordering is changed, things will break, since many
regexps
+ ;; match more than they should.
+
;; known identifiers
((looking-at haskell-tng:regexp:reserved)
(haskell-tng-lexer:last-match))
- ((looking-at haskell-tng:regexp:qvarid)
- (haskell-tng-lexer:last-match nil "VARID"))
- ((looking-at haskell-tng:regexp:qconid)
- (haskell-tng-lexer:last-match nil "CONID"))
- ((looking-at haskell-tng:regexp:qconsym)
+ ((looking-at haskell-tng:regexp:qual)
+ ;; Matches qualifiers separately from identifiers because the
+ ;; backwards lexer is not greedy enough. Qualifiers are not
+ ;; interesting from a grammar point of view so we ignore them.
+ (haskell-tng-lexer:last-match nil "")
+ (haskell-tng-lexer:forward-token))
+ ((looking-at haskell-tng:regexp:consym)
(haskell-tng-lexer:last-match nil "CONSYM"))
- ;; TODO symid
+ ((looking-at haskell-tng:regexp:conid)
+ (haskell-tng-lexer:last-match nil "CONID"))
+ ((looking-at haskell-tng:regexp:varid)
+ (haskell-tng-lexer:last-match nil "VARID"))
+ ((looking-at haskell-tng:regexp:symid)
+ (haskell-tng-lexer:last-match nil "SYMID"))
;; TODO numeric literals
- ;; TODO l1==l2 is not parsed correctly as VARID SYMID VARID
- ((or
- ;; known identifiers
- (looking-at haskell-tng:regexp:reserved)
- ;; symbols
- (looking-at (rx (+ (| (syntax word) (syntax symbol))))))
+ ;; unknown things
+ ((looking-at (rx (+ (| (syntax word) (syntax symbol)))))
(haskell-tng-lexer:last-match))
-
;; single char
(t
(forward-char)
@@ -136,12 +141,17 @@ the lexer."
;; known identifiers
((looking-back haskell-tng:regexp:reserved (- (point) 8))
(haskell-tng-lexer:last-match 'reverse))
- ((looking-back haskell-tng:regexp:qvarid lbp 't)
- (haskell-tng-lexer:last-match 'reverse "VARID"))
- ((looking-back haskell-tng:regexp:qconid lbp 't)
- (haskell-tng-lexer:last-match 'reverse "CONID"))
- ((looking-back haskell-tng:regexp:qconsym lbp 't)
+ ((looking-back haskell-tng:regexp:qual lbp 't)
+ (haskell-tng-lexer:last-match 'reverse "")
+ (haskell-tng-lexer:backward-token))
+ ((looking-back haskell-tng:regexp:consym lbp 't)
(haskell-tng-lexer:last-match 'reverse "CONSYM"))
+ ((looking-back haskell-tng:regexp:conid lbp 't)
+ (haskell-tng-lexer:last-match 'reverse "CONID"))
+ ((looking-back haskell-tng:regexp:varid lbp 't)
+ (haskell-tng-lexer:last-match 'reverse "VARID"))
+ ((looking-back haskell-tng:regexp:symid lbp 't)
+ (haskell-tng-lexer:last-match 'reverse "SYMID"))
((looking-back (rx (+ (| (syntax word) (syntax symbol)))) lbp 't)
(haskell-tng-lexer:last-match 'reverse))
(t
diff --git a/haskell-tng-rx.el b/haskell-tng-rx.el
new file mode 100644
index 0000000..eb0a9c3
--- /dev/null
+++ b/haskell-tng-rx.el
@@ -0,0 +1,68 @@
+;;; haskell-tng-rx.el --- Internal: regular expressions -*- lexical-binding: t
-*-
+
+;; Copyright (C) 2018-2019 Tseen She
+;; License: GPL 3 or any later version
+
+;;; Commentary:
+;;
+;; `rx' expressions and their compiled regexps; used by lexing, syntax table,
+;; fontification and more.
+;;
+;;; Code:
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Here are `rx' patterns that are reused as a very simple form of BNF grammar.
+;; Word/symbol boundaries to help backwards regexp searches to be greedy
+(defconst haskell-tng:rx:consym '(: (or "'" ":") ;; Datakinds
+ (+ (syntax symbol))))
+(defconst haskell-tng:rx:conid '(: word-start upper (* word)))
+(defconst haskell-tng:rx:varid '(: word-start (any lower ?_) (* (any word))))
+(defconst haskell-tng:rx:symid '(: (+ (syntax symbol))))
+(defconst haskell-tng:rx:qual `(: symbol-start
+ (+ (: ,haskell-tng:rx:conid (char ?.)))))
+
+(defconst haskell-tng:rx:reserved
+ '(|
+ (: word-start
+ (| "case" "class" "data" "default" "deriving" "do" "else"
+ "foreign" "if" "import" "in" "infix" "infixl"
+ "infixr" "instance" "let" "module" "newtype" "of"
+ "then" "type" "where" "_")
+ word-end)
+ (: symbol-start
+ (| ".." ":" "::" "=" "|" "<-" "->" "@" "~" "=>")
+ symbol-end)
+ (: symbol-start (char ?\\)))
+ "reservedid / reservedop")
+
+(defconst haskell-tng:rx:toplevel
+ ;; TODO multi-definitions, e.g. Servant's :<|>
+ `(: line-start (group (| ,haskell-tng:rx:varid
+ (: "(" (+? (syntax symbol)) ")")))
+ symbol-end))
+;; note that \n has syntax `comment-end'
+(defconst haskell-tng:rx:newline
+ '(| (syntax comment-end)
+ (: symbol-start
+ "--"
+ (+ (not (syntax comment-end)))
+ (syntax comment-end)))
+ "Newline or line comment.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Compiled regexps
+(defconst haskell-tng:regexp:reserved
+ (rx-to-string haskell-tng:rx:reserved))
+(defconst haskell-tng:regexp:qual
+ (rx-to-string haskell-tng:rx:qual))
+(defconst haskell-tng:regexp:consym
+ (rx-to-string haskell-tng:rx:consym))
+(defconst haskell-tng:regexp:conid
+ (rx-to-string haskell-tng:rx:conid))
+(defconst haskell-tng:regexp:varid
+ (rx-to-string haskell-tng:rx:varid))
+(defconst haskell-tng:regexp:symid
+ (rx-to-string haskell-tng:rx:symid))
+
+(provide 'haskell-tng-rx)
+;;; haskell-tng-rx.el ends here
diff --git a/haskell-tng-smie.el b/haskell-tng-smie.el
index 07254bc..b549e27 100644
--- a/haskell-tng-smie.el
+++ b/haskell-tng-smie.el
@@ -50,16 +50,11 @@
("(" context ")")
(context "," context))
- ;; operators
- ;; TODO lexer should identify / normalise operators.
+ ;; operators, we don't care about precedences
(infixexp
- (id "$" infixexp)
- (id "*" infixexp)
- (id "+" infixexp)
+ (id "SYMID" infixexp)
(id))
- ;; TODO lexer should identify / normalise ids, consid, etc.
-
;; WLDOs
(wldo
("where" decls)
diff --git a/haskell-tng-syntax.el b/haskell-tng-syntax.el
index 1761539..1d32423 100644
--- a/haskell-tng-syntax.el
+++ b/haskell-tng-syntax.el
@@ -10,6 +10,7 @@
;; such as font-lock and SMIE lexing / parsing, where it is needed.
;;
;;
https://www.gnu.org/software/emacs/manual/html_mono/elisp.html#Syntax-Tables
+;;
https://www.gnu.org/software/emacs/manual/html_mono/elisp.html#Syntax-Table-Internals
;;
;;; Code:
@@ -38,16 +39,17 @@
(--each (string-to-list "!#$%&*+./<=>?@\\^|-~:")
(modify-syntax-entry it "_" table))
- ;; TODO: should be iff _ is alone or first char
- ;; small (underscore is a lowercase letter)
+ ;; TODO: debatable. User nav vs fonts and lexing. getting "word boundaries"
+ ;; is important, same for apostrophe. small (underscore is a
lowercase
+ ;; letter)
(modify-syntax-entry ?_ "w" table)
;; some special (treated like punctuation)
(--each (string-to-list ",;")
(modify-syntax-entry it "." table))
- ;; apostrophe as a symbol, not delimiter
- (modify-syntax-entry ?\' "_" table)
+ ;; apostrophe as a word, not delimiter
+ (modify-syntax-entry ?\' "w" table)
;; string delimiter
(modify-syntax-entry ?\" "\"" table)
@@ -72,23 +74,26 @@
(defun haskell-tng:syntax-propertize (start end)
"For some context-sensitive syntax entries."
(haskell-tng:syntax:char-delims start end)
+ (haskell-tng:syntax:typelevel-lists start end)
(haskell-tng:syntax:escapes start end))
-;; TODO doesn't handle the following correctly
-;;
-;; foo' 'a' 2
(defun haskell-tng:syntax:char-delims (start end)
"Matching apostrophes are string delimiters (literal chars)."
(goto-char start)
- (while (re-search-forward "'\\\\?.'" end t)
+ ;; should handle: foo' 'a' 2 because ' is a word here
+ (while (re-search-forward (rx word-start "'" (? "\\") not-newline "'") end t)
(let ((open (match-beginning 0))
(close (- (point) 1)))
(put-text-property open (1+ open) 'syntax-table '(7 . ?\'))
(put-text-property close (1+ close) 'syntax-table '(7 . ?\')))))
-;; TODO or look for non-string backslashes. While we're at it, we could mark
-;; everything up to the -> with an apat property / category. Alternatively this
-;; would need to be in the lexer (and fontification would miss out).
+(defun haskell-tng:syntax:typelevel-lists (start end)
+ "Apostrophes should be symbols when used in typelevel lists."
+ (goto-char start)
+ (while (re-search-forward (rx space (char ?') (any ?\[ ?:)) end t)
+ (put-text-property (- (point) 1) (point)
+ 'syntax-table '(3 . ?'))))
+
(defun haskell-tng:syntax:escapes (start end)
"Backslash inside String is an escape character."
(goto-char start)
@@ -97,7 +102,5 @@
(put-text-property (- (point) 1) (point)
'syntax-table '(9 . ?\\)))))
-;; EXT:ExplicitForAll should turn dots into punctuation
-
(provide 'haskell-tng-syntax)
;;; haskell-tng-syntax.el ends here
diff --git a/test/src/grammar.hs.sexps b/test/src/grammar.hs.sexps
index 2e8f24b..e5cfece 100644
--- a/test/src/grammar.hs.sexps
+++ b/test/src/grammar.hs.sexps
@@ -1,8 +1,8 @@
-- | Tests for grammar rules i.e. sexps, not indentation
-(module) (Foo.Bar) (where
+(module) (Foo.(Bar)) (where
-(((calc) (::) (Int) (->) (Int))
-((calc) (a) = (if) (a) (<) (10)
+((calc) (::) (Int) -> (Int)
+((calc) (a) = (if) (a) < (10)
(then) (a) + (a) * (a) + (a)
(else) ((a) + (a)) * ((a) + (a)))
))
\ No newline at end of file
diff --git a/test/src/layout.hs.lexer b/test/src/layout.hs.lexer
index 921d495..1920ad6 100644
--- a/test/src/layout.hs.lexer
+++ b/test/src/layout.hs.lexer
@@ -9,7 +9,7 @@ module CONID « CONID , VARID , VARID , VARID , VARID » where
; VARID :: CONID VARID -> CONID
; VARID VARID = VARID « VARID VARID » where
{ VARID CONID = « »
-; VARID « CONID VARID VARID » = x:xs where { VARID = VARID VARID
+; VARID « CONID VARID VARID » = VARID SYMID VARID where { VARID = VARID VARID
} } ; VARID :: CONID VARID -> « VARID , CONID VARID »
; VARID « CONID VARID VARID »
diff --git a/test/src/layout.hs.sexps b/test/src/layout.hs.sexps
index 4519f81..fa4bddc 100644
--- a/test/src/layout.hs.sexps
+++ b/test/src/layout.hs.sexps
@@ -3,18 +3,18 @@
((data) (Stack) (a) = (Empty)
(|) (MkStack) (a) ((Stack) (a))
-((((push) (::) (a) (->) (Stack) (a)) (->) (Stack) (a)))
+((push) (::) (a) -> (Stack) (a) -> (Stack) (a))
((push) (x) (s) = (MkStack) (x) (s))
-(((size) (::) (Stack) (a) (->) (Int)))
+((size) (::) (Stack) (a) -> (Int))
((size) (s) = (length) ((stkToLst) (s)) (where
((stkToLst) (Empty) = ([])
- ((stkToLst) ((MkStack) (x) (s)) = (x:xs) (where ((xs) = (stkToLst)
(s)
+ ((stkToLst) ((MkStack) (x) (s)) = (x):(xs) (where ((xs) =
(stkToLst) (s)
-))))((pop) (::) (Stack) (a) (->) ((a), (Stack) (a)))
+))))(pop) (::) (Stack) (a) -> ((a), (Stack) (a))
((pop) ((MkStack) (x) (s))
- = ((x), (case) (s) (of ((r (->) (i) (r) (where (i (x) = x))))))) -- pop
Empty is an error
+ = ((x), (case) (s) (of (r -> (i) (r) (where (i (x) = x)))))) -- pop Empty is
an error
-(((top) (::) (Stack) (a) (->) (a)))
+((top) (::) (Stack) (a) -> (a))
((top) ((MkStack) (x) (s)) = (x)))) -- top Empty is an
error
))
\ No newline at end of file
diff --git a/test/src/medley.hs b/test/src/medley.hs
index b314e8b..2fd20fc 100644
--- a/test/src/medley.hs
+++ b/test/src/medley.hs
@@ -36,6 +36,8 @@ import System.Process (CreateProcess (..),
StdStream (..),
-- some chars that should be propertized
chars = ['c', '\n', '\'']
+difficult = foo' 'a' 2
+
foo = "wobble (wibble)"
class Get a s where
diff --git a/test/src/medley.hs.faceup b/test/src/medley.hs.faceup
index 60e2d3d..26359eb 100644
--- a/test/src/medley.hs.faceup
+++ b/test/src/medley.hs.faceup
@@ -36,6 +36,8 @@
«m:-- »«x:some chars that should be propertized
»«:haskell-tng:toplevel:chars» «:haskell-tng:keyword:=»
«:haskell-tng:keyword:[»«s:'c'»«:haskell-tng:keyword:,»
«s:'\n'»«:haskell-tng:keyword:,» «s:'\''»«:haskell-tng:keyword:]»
+«:haskell-tng:toplevel:difficult» «:haskell-tng:keyword:=» foo' «s:'a'» 2
+
«:haskell-tng:toplevel:foo» «:haskell-tng:keyword:=» «s:"wobble (wibble)"»
«:haskell-tng:keyword:class»«:haskell-tng:type: Get a s
»«:haskell-tng:keyword:where»
diff --git a/test/src/medley.hs.layout b/test/src/medley.hs.layout
index a87eddb..f3b1a0c 100644
--- a/test/src/medley.hs.layout
+++ b/test/src/medley.hs.layout
@@ -36,6 +36,8 @@ module Foo.Bar.Main
-- some chars that should be propertized
;chars = ['c', '\n', '\'']
+;difficult = foo' 'a' 2
+
;foo = "wobble (wibble)"
;class Get a s where
diff --git a/test/src/medley.hs.lexer b/test/src/medley.hs.lexer
index 22a7910..21bd33d 100644
--- a/test/src/medley.hs.lexer
+++ b/test/src/medley.hs.lexer
@@ -3,17 +3,17 @@
module CONID
-« CONID « .. » , CONID « CONID , « !!! » » , CONID
+« CONID « .. » , CONID « CONID , « SYMID » » , CONID
, VARID , VARID
, module CONID
» where
-{ import CONID « VARID , VARID , VARID , « <*> » , « <|> » »
+{ import CONID « VARID , VARID , VARID , « SYMID » , « SYMID » »
; import CONID « VARID »
-; import CONID « « <$> » »
+; import CONID « « SYMID » »
; import CONID « VARID »
-; import CONID « « <> » »
+; import CONID « « SYMID » »
; import VARID CONID
; import VARID CONID VARID CONID
; import VARID CONID
@@ -36,15 +36,17 @@ VARID , VARID , VARID »
; VARID = « § , § , § »
+; VARID = VARID § 2
+
; VARID = §
; class CONID VARID VARID where
{ VARID :: CONID VARID -> VARID
-} ; instance CONID VARID « VARID ': VARID » where
+} ; instance CONID VARID « VARID CONSYM VARID » where
{ VARID « CONID VARID _ » = VARID
-} ; instance CONID VARID VARID => CONID VARID « VARID ': VARID » where
+} ; instance CONID VARID VARID => CONID VARID « VARID CONSYM VARID » where
{ VARID « CONID _ VARID » = VARID VARID
} ; data CONID = CONID
@@ -55,13 +57,13 @@ VARID , VARID , VARID »
» deriving « CONID , CONID »
; class « CONID VARID » => CONID VARID where
-{ « < » , « <= » , « >= » , « > » :: VARID -> VARID -> CONID
-; VARID @Foo , VARID :: VARID -> VARID -> VARID
+{ « SYMID » , « SYMID » , « SYMID » , « SYMID » :: VARID -> VARID -> CONID
+; VARID SYMID CONID , VARID :: VARID -> VARID -> VARID
} ; instance « CONID VARID » => CONID « CONID VARID » where
-{ CONID VARID == CONID VARID = VARID == VARID
-; « CONID VARID VARID » == « CONID VARID VARID » = « l1==l2 » && « r1==r2 »
-; _ == _ = CONID
+{ CONID VARID SYMID CONID VARID = VARID SYMID VARID
+; « CONID VARID VARID » SYMID « CONID VARID VARID » = « VARID SYMID VARID »
SYMID « VARID SYMID VARID »
+; _ SYMID _ = CONID
} ; data CONID = CONID
| CONID
@@ -101,12 +103,12 @@ VARID
; VARID :: CONID CONID
; VARID = CONID
-<$> « VARID CONID « VARID § <> VARID § »
-<|> VARID CONID « VARID § <> VARID § »
-<|> VARID CONID « VARID § <> VARID § » »
-<*> VARID
+SYMID « VARID CONID « VARID § SYMID VARID § »
+SYMID VARID CONID « VARID § SYMID VARID § »
+SYMID VARID CONID « VARID § SYMID VARID § » »
+SYMID VARID
« VARID
-« VARID § <>
+« VARID § SYMID
VARID § » »
; type CONID
@@ -116,11 +118,11 @@ VARID § » »
CONSYM CONID § CONID
CONSYM CONID CONID CONID
CONSYM CONID
-CONSYM CONID ' « CONID » « CONID CONID »
-CONSYM § CONSYM CONID ' « CONID » CONID
+CONSYM CONID CONSYM CONID » « CONID CONID »
+CONSYM § CONSYM CONID CONSYM CONID » CONID
CONSYM CONID CONID CONID
CONSYM CONID
-CONSYM CONID ' « CONID » « CONID CONID »
+CONSYM CONID CONSYM CONID » « CONID CONID »
; deriving instance CONID CONID
; deriving VARID instance CONID CONID
@@ -130,5 +132,5 @@ CONSYM CONID ' « CONID » « CONID CONID »
where { VARID = _
-; « + » = _
+; « SYMID » = _
} }
- [nongnu] elpa/haskell-tng-mode 5c50be0 044/385: remove redundant TODOs, (continued)
- [nongnu] elpa/haskell-tng-mode 5c50be0 044/385: remove redundant TODOs, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 174c63b 046/385: laying the foundations for SMIE, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 97ce717 058/385: improve the testing, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 2a2afee 064/385: cache invalidation and tests for layout invalidation, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 3ca869f 067/385: code reorganisation, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 0ffb885 071/385: a thought, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 79aeb82 076/385: most of the grammar, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 7eaef51 078/385: optimisation in the sexp test, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode cb0f3d2 082/385: starting indentation rules, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode cfbdae1 084/385: simplify the lexer assertion language, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 0c5acb7 087/385: lexer and grammar supports symid,
ELPA Syncer <=
- [nongnu] elpa/haskell-tng-mode 6c520bc 093/385: fixes for type level lists, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode f085f16 097/385: indentation regression tests, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 01ea0b8 103/385: heuristic alternative indentation levels, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode c20ea4f 096/385: infix varid as symid, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode bfe859a 095/385: notes about lexers, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 0506391 109/385: module ... where indents to 0, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode d9bbcdd 111/385: next steps, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 6cf67bf 105/385: indentation can't handle mismatched parens, don't test for it, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 25b15eb 102/385: indentation alternatives wiring, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode e023657 107/385: SMIE wishlist, ELPA Syncer, 2021/10/06