[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator f23bc217d8 30/82: More wrestling
From: |
Christian Johansson |
Subject: |
[elpa] externals/parser-generator f23bc217d8 30/82: More wrestling |
Date: |
Thu, 12 May 2022 13:28:15 -0400 (EDT) |
branch: externals/parser-generator
commit f23bc217d88396de39ec0dc4ec344ca027bcee01
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
More wrestling
---
parser-generator-ll.el | 12 ++++++++----
parser-generator.el | 30 ++++++++++++++++++++----------
test/parser-generator-ll-test.el | 2 +-
3 files changed, 29 insertions(+), 15 deletions(-)
diff --git a/parser-generator-ll.el b/parser-generator-ll.el
index 82f4e383f7..95816fd0d7 100644
--- a/parser-generator-ll.el
+++ b/parser-generator-ll.el
@@ -91,21 +91,24 @@
look-aheads
(parser-generator--merge-max-terminal-sets
first-rhs
- nil)))
+ nil
+ t)))
((and first-parent-follow
(not first-rhs))
(setq
look-aheads
(parser-generator--merge-max-terminal-sets
nil
- first-parent-follow)))
+ first-parent-follow
+ t)))
((and first-rhs
first-parent-follow)
(setq
look-aheads
(parser-generator--merge-max-terminal-sets
first-rhs
- first-parent-follow)))
+ first-parent-follow
+ t)))
(t (error
"Unexpected empty FIRST for production: %S and parent-follow: %S"
production
@@ -409,7 +412,8 @@
(let ((merged-terminal-sets
(parser-generator--merge-max-terminal-sets
first-sub-symbol-rhs
- first-local-follow-sets)))
+ first-local-follow-sets
+ t)))
(parser-generator--debug
(message "sub-symbol-rhs: %S" sub-symbol-rhs)
(message "first-sub-symbol-rhs: %S"
first-sub-symbol-rhs)
diff --git a/parser-generator.el b/parser-generator.el
index 602391eb10..05e637536f 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -1238,8 +1238,8 @@
look-ahead)))
(nreverse look-ahead)))
-(defun parser-generator--merge-max-terminal-sets (a b)
- "Calculate list of all lists of L1 (+) L2 which is a merge of all terminals
in lists A combined with all terminals in lists B but with maximum length of
the set look-ahead number."
+(defun parser-generator--merge-max-terminal-sets (a b &optional
abort-on-e-identifier)
+ "Calculate list of all lists of L1 (+) L2 which is a merge of all terminals
in lists A combined with all terminals in lists B but with maximum length of
the set look-ahead number, optionally ABORT-ON-E-IDENTIFIER."
(let ((a-length (length a))
(a-index 0)
(b-length (length b))
@@ -1255,7 +1255,8 @@
((merged-element
(parser-generator--merge-max-terminals
a-element
- b-element)))
+ b-element
+ abort-on-e-identifier)))
(if merged-lists
(setq
merged-lists
@@ -1274,7 +1275,8 @@
((merged-element
(parser-generator--merge-max-terminals
a-element
- nil)))
+ nil
+ abort-on-e-identifier)))
(if merged-lists
(setq
merged-lists
@@ -1294,7 +1296,8 @@
((merged-element
(parser-generator--merge-max-terminals
nil
- b-element)))
+ b-element
+ abort-on-e-identifier)))
(if merged-lists
(setq
merged-lists
@@ -1317,8 +1320,8 @@
merged-lists))
;; Lemma 5.1 p. 348
-(defun parser-generator--merge-max-terminals (a b)
- "Calculate L1 (+) L2 which is a merge of all terminals in A and B but with
exactly length of the set look-ahead number."
+(defun parser-generator--merge-max-terminals (a b &optional
abort-on-e-identifier)
+ "Calculate L1 (+) L2 which is a merge of all terminals in A and B but with
exactly length of the set look-ahead number, optionally ABORT-ON-E-IDENTIFIER."
(let ((k (max 1 parser-generator--look-ahead-number))
(merged)
(merge-count 0)
@@ -1327,20 +1330,27 @@
(a-length (length a))
(b-element)
(b-index 0)
- (b-length (length b)))
+ (b-length (length b))
+ (continue t))
(while (and
+ continue
(< a-index a-length)
(< merge-count k))
(setq a-element (nth a-index a))
- (unless (parser-generator--valid-e-p a-element)
+ (if (parser-generator--valid-e-p a-element)
+ (when abort-on-e-identifier
+ (setq continue nil))
(push a-element merged)
(setq merge-count (1+ merge-count)))
(setq a-index (1+ a-index)))
(while (and
+ continue
(< b-index b-length)
(< merge-count k))
(setq b-element (nth b-index b))
- (unless (parser-generator--valid-e-p b-element)
+ (if (parser-generator--valid-e-p b-element)
+ (when abort-on-e-identifier
+ (setq continue nil))
(push b-element merged)
(setq merge-count (1+ merge-count)))
(setq b-index (1+ b-index)))
diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el
index 6f103ef8f8..e1f88745f9 100644
--- a/test/parser-generator-ll-test.el
+++ b/test/parser-generator-ll-test.el
@@ -33,7 +33,7 @@
)
(parser-generator-process-grammar)
(let ((tables (parser-generator-ll--generate-tables)))
- (message "tables: %S" tables)
+ (message "tables 1: %S" tables)
(should
(equal
tables
- [elpa] externals/parser-generator 7a265c9a84 67/82: LL-tests now runs on make tests command, (continued)
- [elpa] externals/parser-generator 7a265c9a84 67/82: LL-tests now runs on make tests command, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator a046c8584d 73/82: Started on documentation for LL(k) and LL(1), Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator f07939a440 76/82: Added example from Wikipedia and passing test, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 03a11c4369 14/82: Started test for LL(k) parser-table generation, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 9d6ca94d0e 02/82: More work on LL(k) parser, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 6ce0dd9429 04/82: Improved function to calculate merge max terminal sets, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 52734d7160 16/82: Updated TODO items, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 7b77032f71 22/82: Parser table generation for LLk now works for productions, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator fe728f8ad8 23/82: Passing test for generating LLk parser table, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 3b9977b51b 28/82: More work on LLk test, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator f23bc217d8 30/82: More wrestling,
Christian Johansson <=
- [elpa] externals/parser-generator 6e91a4b498 32/82: More work on helper functions, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 80dd506b65 33/82: More work on LL-helper functions, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator e6f9ac545f 37/82: Cleanup after byte-compilation, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator cf4332ef0e 40/82: Started on LLk parsing algorithm, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator f5f7b2c82b 41/82: Added TODO items, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 2e76c4b57e 42/82: Added TODO items, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 8f9e4d4537 46/82: Passing 2 parse examples with k=2, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator fe0decba88 50/82: Passed one test for LLk where k=1, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 72bbadddc0 51/82: Added TODO items, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 2e2496d51f 54/82: Added notes, Christian Johansson, 2022/05/12