[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 18d7c63 195/434: Added new function to
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 18d7c63 195/434: Added new function to merge lists of terminals |
Date: |
Mon, 29 Nov 2021 15:59:39 -0500 (EST) |
branch: externals/parser-generator
commit 18d7c63fe431722c730f506f86c80d426daec19a
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Added new function to merge lists of terminals
---
parser-generator.el | 38 ++++++++++++++++++++++++++++++++++++--
test/parser-generator-test.el | 23 +++++++++++++++++++++++
2 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/parser-generator.el b/parser-generator.el
index 25c0e4d..a712d56 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -11,7 +11,7 @@
(defvar parser-generator--debug
- nil
+ t
"Whether to print debug messages or not.")
(defvar parser-generator--e-identifier
@@ -708,6 +708,37 @@
(parser-generator--debug
(message "Generated F-sets"))))
+(defun parser-generator--merge-max-terminals (a b k)
+ "Merge terminals from A and B to a maximum length of K."
+ (let ((merged)
+ (merge-count 0)
+ (continue t)
+ (a-element)
+ (a-index 0)
+ (a-length (length a))
+ (b-element)
+ (b-index 0)
+ (b-length (length b)))
+ (while (and
+ (< a-index a-length)
+ (< merge-count k)
+ continue)
+ (setq a-element (nth a-index a))
+ (if (parser-generator--valid-e-p a-element)
+ (setq continue nil)
+ (push a-element merged))
+ (setq a-index (1+ a-index)))
+ (while (and
+ (< b-index b-length)
+ (< merge-count k)
+ continue)
+ (setq b-element (nth b-index b))
+ (if (parser-generator--valid-e-p b-element)
+ (setq continue nil)
+ (push b-element merged))
+ (setq b-index (1+ b-index)))
+ merged))
+
;; p. 357
(defun parser-generator--f-set (input-tape state stack)
"A deterministic push-down transducer (DPDT) for building F-sets from
INPUT-TAPE, STATE and STACK."
@@ -872,7 +903,7 @@
,alternative-leading-terminals
,alternative-all-leading-terminals-p
,(1+
input-tape-index))))
- (parser-generator--debug
(message "branched off01: %s" branch))
+ (parser-generator--debug
(message "branched off 0: %s" branch))
;; Branch off here with
a separate track where this e-identifier is ignored
(push branch stack)))))
@@ -942,7 +973,9 @@
(parser-generator--debug (message
"branched off 5: %s" branch))
(push branch stack)))
+ (parser-generator--debug (message
"leading-terminals-1: %s" leading-terminals))
(setq leading-terminals (append
leading-terminals sub-terminal-set))
+ (parser-generator--debug (message
"leading-terminals-2: %s" leading-terminals))
(setq leading-terminals-count (+
leading-terminals-count (length sub-terminal-set)))
(when (> leading-terminals-count k)
(setq leading-terminals (butlast
leading-terminals (- leading-terminals-count k)))
@@ -1008,6 +1041,7 @@
(when (> leading-terminals-count 0)
(unless (listp leading-terminals)
(setq leading-terminals (list leading-terminals)))
+ (message "leading-terminals: %s" leading-terminals)
(push leading-terminals f-set))))))
(list expanded-all f-set)))
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index 5446bb0..8110599 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -624,6 +624,28 @@
(message "Passed tests for (parser-generator--valid-terminal-p)"))
+(defun parser-generator-test--merge-max-terminals ()
+ "Test `parser-generator--merge-max-terminals'."
+ (message "Passed tests for (parser-generator--merge-max-terminals)")
+
+ (should
+ (equal
+ '(a b e)
+ (parser-generator--merge-max-terminals
+ '(a)
+ '(b e)
+ 3)))
+
+ (should
+ (equal
+ '(a e)
+ (parser-generator--merge-max-terminals
+ '(a e)
+ '(b e)
+ 3)))
+
+ (message "Passed tests for (parser-generator--merge-max-terminals)"))
+
(defun parser-generator-test ()
"Run test."
;; (setq debug-on-error t)
@@ -640,6 +662,7 @@
(parser-generator-test--sort-list)
(parser-generator-test--get-grammar-rhs)
(parser-generator-test--get-grammar-look-aheads)
+ (parser-generator-test--merge-max-terminals)
;; Algorithms
(parser-generator-test--first)
- [elpa] externals/parser-generator 0695275 143/434: More updates to docs, (continued)
- [elpa] externals/parser-generator 0695275 143/434: More updates to docs, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 1b17ef8 159/434: Added another unit tests for translations, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 04fdc96 167/434: Added unit-test for incremental translations, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fa6237a 170/434: Added TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 71f03cc 171/434: Updated example, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0b72792 177/434: Added failing unit tests for FIRST, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 181b499 178/434: Fixed bug in FIRST generation where multiple equal LHS:s, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator c4455db 179/434: Added TODO-item, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 84ffb4e 181/434: f-set max index is now set depending on if all non-terminals have been expanded or not, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4aeed22 191/434: Passed tests for e-free first function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 18d7c63 195/434: Added new function to merge lists of terminals,
ELPA Syncer <=
- [elpa] externals/parser-generator 60d9968 202/434: Fixed valid look-ahead with k above 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 38223d3 206/434: Passed tests for generating grammar prefixes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8a6b752 208/434: Starting on adding support for LR k > 1 parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d604092 223/434: Added failing unit test for e-free-first function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 172d530 214/434: Improved handling of production LHS to enable multiple symbols, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fbc8f8b 225/434: Removed dependency of hash-table of terminals for LR parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 870eca2 232/434: Reduced depth of GOTO-table to always use one symbol, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5b45b2b 235/434: Improved comments, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator c2d2d0d 239/434: Fixed FIRST calculating when building lr-item sets, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a516e3f 234/434: Started on new test for LR(2) Parser, ELPA Syncer, 2021/11/29