branch: externals/parser-generator
commit 922033f02cc10e09f1c26ca87cf6c2b770c2f1c5
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
Various stuff
---
parser-generator-lr.el | 11 ++++++---
test/parser-generator-lr-test.el | 53 ++++++++++++++++++++++------------------
2 files changed, 36 insertions(+), 28 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 3ee60f2..c6078bd 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -108,15 +108,18 @@
(error "Expecting production number for %s
from LR-item %s!" production lr-item))
(if (and
- (= production-number 0)
- (= (length u) 1)
- (parser-generator--valid-e-p (car u)))
+ (>= (length u) 1)
+ (parser-generator--valid-e-p
+ (nth (1- (length u)) u)))
(progn
;; Reduction by first production
;; of empty look-ahead means grammar
has been accepted
+ (message "accept of %s" u)
(push (list u 'accept) action-table)
(setq found-action t))
+ (message "no accept of %s, p: %s" u
production-number)
+
;; save reduction action in action table
(push (list u 'reduce production-number)
action-table)
(setq found-action t))))))))))
@@ -592,7 +595,7 @@
;; transfer to an error recovery routine).
(error (format
- "Invalid syntax! Expected one of %s found %s at index
%s"
+ "Invalid syntax! Expected one of %s found %s at index
%s "
possible-look-aheads
look-ahead
parser-generator-lex-analyzer--index)
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 75c5fef..56f717a 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -312,6 +312,8 @@
(parser-generator-set-look-ahead-number 1)
(parser-generator-process-grammar)
(parser-generator-lr-generate-parser-tables)
+ (message "goto-tables: %s" (parser-generator--hash-values-to-list
parser-generator-lr--goto-tables t))
+ (message "action-tables: %s" (parser-generator--hash-values-to-list
parser-generator-lr--action-tables t))
(setq
parser-generator-lex-analyzer--function
(lambda (index)
@@ -365,29 +367,32 @@
(parser-generator-lr-test--parse-incremental-vs-regular)
(message "Passed incremental-tests")
- ;; (parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S
"b")) (S e)) Sp))
- ;; (parser-generator-set-look-ahead-number 2)
- ;; (parser-generator-process-grammar)
- ;; (let ((lr-items (parser-generator--hash-values-to-list
(parser-generator-lr-generate-parser-tables) t)))
- ;; (message "lr-items: %s" lr-items))
- ;; (setq
- ;; parser-generator-lex-analyzer--function
- ;; (lambda (index)
- ;; (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4)))
- ;; (string-length (length string))
- ;; (max-index index)
- ;; (tokens))
- ;; (while (and
- ;; (< (1- index) string-length)
- ;; (< (1- index) max-index))
- ;; (push (nth (1- index) string) tokens)
- ;; (setq index (1+ index)))
- ;; (nreverse tokens))))
- ;; (should
- ;; (equal
- ;; '(2 2 2 1 1)
- ;; (parser-generator-lr-parse)))
- ;; (message "Passed test with terminals as string with look-ahead-number 2")
+ (parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b"))
(S e)) Sp))
+ (parser-generator-set-look-ahead-number 2)
+ (parser-generator-process-grammar)
+ (let ((lr-items (parser-generator--hash-values-to-list
(parser-generator-lr-generate-parser-tables) t)))
+ (message "lr-items: %s" lr-items)
+ (message "goto-tables: %s" (parser-generator--hash-values-to-list
parser-generator-lr--goto-tables t))
+ ;; TODO Should generate accept somewhere in this action-table
+ (message "action-tables: %s" (parser-generator--hash-values-to-list
parser-generator-lr--action-tables t)))
+ (setq
+ parser-generator-lex-analyzer--function
+ (lambda (index)
+ (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4)))
+ (string-length (length string))
+ (max-index index)
+ (tokens))
+ (while (and
+ (< (1- index) string-length)
+ (< (1- index) max-index))
+ (push (nth (1- index) string) tokens)
+ (setq index (1+ index)))
+ (nreverse tokens))))
+ (should
+ (equal
+ '(2 2 2 1 1)
+ (parser-generator-lr-parse)))
+ (message "Passed test with terminals as string with look-ahead-number 2")
(message "Passed tests for (parser-generator-lr--parse)"))
@@ -551,7 +556,7 @@
(defun parser-generator-lr-test ()
"Run test."
- (setq debug-on-error t)
+ ;; (setq debug-on-error t)
(parser-generator-lr-test--items-for-prefix)
(parser-generator-lr-test--items-valid-p)