branch: externals/parser-generator
commit 33634ddda5a1a6bae2bf524d0b7fe7aa04059fc9
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
Passing all tests after refactor
---
parser-generator-lex-analyzer.el | 40 ++++++++++++++++++------------
test/parser-generator-lex-analyzer-test.el | 8 +++---
test/parser-generator-lr-test.el | 36 ++++++++++++++++++---------
3 files changed, 53 insertions(+), 31 deletions(-)
diff --git a/parser-generator-lex-analyzer.el b/parser-generator-lex-analyzer.el
index 6f0609f..e2aa7e4 100644
--- a/parser-generator-lex-analyzer.el
+++ b/parser-generator-lex-analyzer.el
@@ -58,7 +58,7 @@
(unless parser-generator-lex-analyzer--function
(error "Missing lex-analyzer function!"))
(unless parser-generator--look-ahead-number
- (error "Missing look-ahead number!"))
+ (error "Missing look-ahead-number!"))
(let ((look-ahead)
(look-ahead-length 0)
(index parser-generator-lex-analyzer--index))
@@ -97,21 +97,29 @@
(error "Missing lex-analyzer index!"))
(unless parser-generator-lex-analyzer--function
(error "Missing lex-analyzer function!"))
- (condition-case error
- (progn
- (let ((token (funcall
- parser-generator-lex-analyzer--function
- parser-generator-lex-analyzer--index)))
- (unless (listp (car token))
- (setq token (list token)))
- (let ((first-token (car token)))
- (setq parser-generator-lex-analyzer--index
- (cdr (cdr first-token)))
- first-token)))
- (error (error
- "Lex-analyze failed to pop token at %s, error: %s"
- parser-generator-lex-analyzer--index
- (car (cdr error))))))
+ (unless parser-generator--look-ahead-number
+ (error "Missing look-ahead-number!"))
+ (let ((iteration 0)
+ (tokens))
+ (while (< iteration parser-generator--look-ahead-number)
+ (condition-case error
+ (progn
+ (let ((token
+ (funcall
+ parser-generator-lex-analyzer--function
+ parser-generator-lex-analyzer--index)))
+ (unless (listp (car token))
+ (setq token (list token)))
+ (let ((first-token (car token)))
+ (setq parser-generator-lex-analyzer--index
+ (cdr (cdr first-token)))
+ (push first-token tokens))))
+ (error (error
+ "Lex-analyze failed to pop token at %s, error: %s"
+ parser-generator-lex-analyzer--index
+ (car (cdr error)))))
+ (setq iteration (1+ iteration)))
+ (nreverse tokens)))
(defun parser-generator-lex-analyzer--reset ()
"Reset lex-analyzer."
diff --git a/test/parser-generator-lex-analyzer-test.el
b/test/parser-generator-lex-analyzer-test.el
index e3fcc9c..5cee3f0 100644
--- a/test/parser-generator-lex-analyzer-test.el
+++ b/test/parser-generator-lex-analyzer-test.el
@@ -113,17 +113,19 @@
(message "Passed failing lex analysis 2")
+ (setq parser-generator--look-ahead-number 1)
+
(should
(equal
- '("a" 1 . 2)
+ '(("a" 1 . 2))
(parser-generator-lex-analyzer--pop-token)))
(should
(equal
- '("b" 2 . 3)
+ '(("b" 2 . 3))
(parser-generator-lex-analyzer--pop-token)))
(should
(equal
- nil
+ '(nil)
(parser-generator-lex-analyzer--pop-token)))
(message "Ended tests for (parser-generator-lex-analyzer--pop-token)"))
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index f0327b4..89fe758 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -272,7 +272,6 @@
(parser-generator-set-look-ahead-number 1)
(parser-generator-process-grammar)
(parser-generator-lr-generate-parser-tables)
-
(setq
parser-generator-lex-analyzer--function
(lambda (index)
@@ -286,12 +285,10 @@
(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 symbols")
(setq
@@ -307,19 +304,14 @@
(push (nth (1- index) string) tokens)
(setq index (1+ index)))
(nreverse tokens))))
-
(should-error
(parser-generator-lr--parse))
-
(message "Passed test with terminals as symbols, invalid syntax")
- ;; Test with terminals as strings here
-
(parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b"))
(S e)) Sp))
(parser-generator-set-look-ahead-number 1)
(parser-generator-process-grammar)
(parser-generator-lr-generate-parser-tables)
-
(setq
parser-generator-lex-analyzer--function
(lambda (index)
@@ -333,12 +325,10 @@
(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")
(setq
@@ -354,10 +344,8 @@
(push (nth (1- index) string) tokens)
(setq index (1+ index)))
(nreverse tokens))))
-
(should-error
(parser-generator-lr--parse))
-
(message "Passed test with terminals as string, invalid syntax")
(setq
@@ -378,6 +366,30 @@
(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)
+ ;; (parser-generator-lr-generate-parser-tables)
+ ;; (setq
+ ;; parser-generator-lex-analyzer--function
+ ;; (lambda (index)
+ ;; (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4) ("b" 4 . 5)))
+ ;; (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)"))
(defun parser-generator-lr-test-translate ()