emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/parser-generator 9eca533 410/434: Added test and implem


From: ELPA Syncer
Subject: [elpa] externals/parser-generator 9eca533 410/434: Added test and implementation of calculating FIRST on multiple symbols were first is a non-terminal that expands into an e-identifier
Date: Mon, 29 Nov 2021 16:00:26 -0500 (EST)

branch: externals/parser-generator
commit 9eca533a5e414366a3a0c2fd44bd14e02582f36e
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>

    Added test and implementation of calculating FIRST on multiple symbols were 
first is a non-terminal that expands into an e-identifier
---
 parser-generator.el           | 14 ++++++++++++++
 test/parser-generator-test.el | 22 +++++++++++++++++++++-
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/parser-generator.el b/parser-generator.el
index 37cd085..39d7e4b 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -1819,6 +1819,20 @@
                              (message
                               "main-symbol-f-set: %s"
                               (car symbol-f-set)))
+
+                            ;; When there a symbols left on stack, make 
alternative trail by skipping this symbol
+                            (when (and
+                                   (parser-generator--valid-e-p (car (car 
symbol-f-set)))
+                                   (not disallow-e-first)
+                                   (< input-tape-index (1- input-tape-length)))
+                              (parser-generator--debug
+                               (message
+                                "Pushed alternative trail from non-terminal 
expansion to stack since first symbol is the e-identifier: %s"
+                                `(,(1+ input-tape-index) ,first-length 
,first)))
+                              (push
+                               `(,(1+ input-tape-index) ,first-length ,first)
+                               stack))
+
                             (setq
                              first-length
                              (+ first-length (length (car symbol-f-set))))
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index 980b3dc..f9f62e6 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -406,7 +406,27 @@
    (equal
     '((a) (c) (e))
     (parser-generator--first '(e Sp))))
-  (message "Passed first 11 with multiple items")
+  (message "Passed first 11 with multiple items with e-identifiers")
+
+  (parser-generator-set-grammar
+   '(
+     (Sp S A B C)
+     (a b c)
+     (
+      (Sp S)
+      (S (A C B))
+      (A a)
+      (B b)
+      (C e)
+      )
+     Sp))
+  (parser-generator-set-look-ahead-number 1)
+  (parser-generator-process-grammar)
+  (should
+   (equal
+    (parser-generator--first '(C B))
+    '((b) (e))))
+  (message "Passed first 12 with multiple non-terminals and e-identifiers")
 
   (message "Passed tests for (parser-generator--first)"))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]