[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 8f9e4d4537 46/82: Passing 2 parse exam
From: |
Christian Johansson |
Subject: |
[elpa] externals/parser-generator 8f9e4d4537 46/82: Passing 2 parse examples with k=2 |
Date: |
Thu, 12 May 2022 13:28:16 -0400 (EDT) |
branch: externals/parser-generator
commit 8f9e4d4537343d89432de56048c4d8afc3736aea
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Passing 2 parse examples with k=2
---
parser-generator-ll.el | 42 +++++++-----
test/parser-generator-ll-test.el | 137 ++++++++++++++++++++++++++++++++++++---
2 files changed, 153 insertions(+), 26 deletions(-)
diff --git a/parser-generator-ll.el b/parser-generator-ll.el
index 19ff1790fd..3cd5a1825f 100644
--- a/parser-generator-ll.el
+++ b/parser-generator-ll.el
@@ -77,8 +77,15 @@
(list
(parser-generator--get-grammar-start))
(list
- parser-generator--eof-identifier))))
- (output))
+ parser-generator--eof-identifier))
+ parser-generator--eof-identifier))
+ (output)
+ (eof-look-ahead
+ (parser-generator--generate-list-of-symbol
+ parser-generator--look-ahead-number
+ parser-generator--eof-identifier))
+ (e-reduction
+ (list parser-generator--e-identifier)))
(parser-generator-lex-analyzer--reset)
(while (not accept)
(let* ((state (car stack))
@@ -89,8 +96,10 @@
(look-ahead-list
(parser-generator-lex-analyzer--peek-next-look-ahead))
(look-ahead))
- (message "\nstate: %S" state)
- (message "\nstate-action-table: %S" state-action-table)
+ (message "\nstack: %S" stack)
+ (message "output: %S" output)
+ (message "state: %S" state)
+ (message "state-action-table: %S" state-action-table)
(unless state-action-table
(signal
@@ -103,12 +112,12 @@
(if look-ahead-list
(progn
(message "look-ahead-list: %S" look-ahead-list)
- (setq
- look-ahead
- (list (car (car look-ahead-list)))))
+ (dolist (look-ahead-list-item look-ahead-list)
+ (push (car look-ahead-list-item) look-ahead))
+ (setq look-ahead (reverse look-ahead)))
(setq
look-ahead
- (list parser-generator--eof-identifier)))
+ eof-look-ahead))
(message "look-ahead: %S" look-ahead)
@@ -137,24 +146,25 @@
(setq action-type (car action)))
(message "action-type: %S" action-type)
(cond
+
((equal action-type 'pop)
- (message "pushed: %S" look-ahead-list)
- (push
- (car (parser-generator-lex-analyzer--pop-token))
- stack))
+ (message "pushed: %S" look-ahead)
+ (parser-generator-lex-analyzer--pop-token)
+ (pop stack))
((equal action-type 'reduce)
(message "reduced: %S" (nth 1 action))
- (push
- (nth 1 action)
- stack)
+ (pop stack)
+ (unless (equal (nth 1 action) e-reduction)
+ (dolist (reduce-item (reverse (nth 1 action)))
+ (push reduce-item stack)))
(push
(nth 2 action)
output))
((equal action-type 'accept)
(setq accept t))))))
- output))
+ (reverse output)))
;;; Algorithms
diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el
index 03d012f2e0..0ad363b268 100644
--- a/test/parser-generator-ll-test.el
+++ b/test/parser-generator-ll-test.el
@@ -279,25 +279,63 @@
(parser-generator-set-eof-identifier '$)
(parser-generator-set-e-identifier 'e)
- (parser-generator-set-look-ahead-number 1)
+ (parser-generator-set-look-ahead-number 2)
(parser-generator-set-grammar
'(
(S A)
(a b)
(
- (S (a A S) b)
- (A a (b S a))
+ (S (a A a a) (b A b a))
+ (A b e)
+ )
+ S
+ )
+ )
+ (parser-generator-process-grammar)
+ (parser-generator-ll-generate-parser-tables)
+ (setq
+ parser-generator-lex-analyzer--function
+ (lambda (index)
+ (let* ((string '((b 1 . 2) (b 2 . 3) (a 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))))
+ (setq
+ parser-generator-lex-analyzer--get-function
+ (lambda (token)
+ (car token)))
+ (should
+ (equal
+ '(1 3) ;; Example is indexed from 1 so that is why they have '(2 4)
+ (parser-generator-ll-parse)))
+ (message "Passed example 5.16 p. 352")
+
+ (parser-generator-set-eof-identifier '$)
+ (parser-generator-set-e-identifier 'e)
+ (parser-generator-set-look-ahead-number 2)
+ (parser-generator-set-grammar
+ '(
+ (S A)
+ (a b)
+ (
+ (S e (a b A))
+ (A (S a a) b)
)
S
)
)
(parser-generator-process-grammar)
(parser-generator-ll-generate-parser-tables)
- ;; (message "parser-generator-ll--parsing-table: %S"
parser-generator-ll--parsing-table)
(setq
parser-generator-lex-analyzer--function
(lambda (index)
- (let* ((string '((a 1 . 2) (b 2 . 3) (b 3 . 4) (a 4 . 5) (b 5 . 6)))
+ (let* ((string '((a 1 . 2) (b 2 . 3) (a 3 . 4) (a 4 . 5)))
(string-length (length string))
(max-index index)
(tokens))
@@ -314,14 +352,93 @@
(parser-generator-ll-parse)
(should
(equal
- '(1 4 2 3 2)
+ '(1 2 0) ;; Example is indexed from 1 so that is why they have '(2 3 1)
(parser-generator-ll-parse)))
- ;; TODO Test example 5.5 p. 340
+ (message "Passed example 5.17 p. 355")
+ (parser-generator-set-eof-identifier '$)
+ (parser-generator-set-e-identifier 'e)
+ (parser-generator-set-look-ahead-number 1)
+ (parser-generator-set-grammar
+ '(
+ (E E2 T T2 F)
+ ("a" "(" ")" "+" "*")
+ (
+ (E (T E2))
+ (E2 ("+" T E2) e)
+ (T (F T2))
+ (T2 ("*" F T2) e)
+ (F ("(" E ")") "a")
+ )
+ E
+ )
+ )
+ (parser-generator-process-grammar)
+ (parser-generator-ll-generate-parser-tables)
+ ;; (message "parser-generator-ll--parsing-table: %S"
parser-generator-ll--parsing-table)
+ (setq
+ parser-generator-lex-analyzer--function
+ (lambda (index)
+ (let* ((string '(("(" 1 . 2) ("a" 2 . 3) ("*" 3 . 4) ("a" 4 . 5) (")" 5 .
6)))
+ (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))))
+ (setq
+ parser-generator-lex-analyzer--get-function
+ (lambda (token)
+ (car token)))
+ (parser-generator-ll-parse)
+ (should
+ (equal
+ '(0 3 6 0 3 7 5 2 5) ;; Example is 1-indexed '(1 4 7 1 4 8 5 8 6 3 6 3)
+ (parser-generator-ll-parse)))
+ (message "Passed example 5.12 p. 346-347")
- ;; TODO Test example 5.12 p. 346-347
- ;; TODO Test example 5.16 p. 352
- ;; TODO Test example 5.17 p. 355
+ (parser-generator-set-eof-identifier '$)
+ (parser-generator-set-e-identifier 'e)
+ (parser-generator-set-look-ahead-number 2)
+ (parser-generator-set-grammar
+ '(
+ (S A)
+ (a b)
+ (
+ (S e (a b A))
+ (A (S a a) b)
+ )
+ S
+ )
+ )
+ (parser-generator-process-grammar)
+ (parser-generator-ll-generate-parser-tables)
+ (setq
+ parser-generator-lex-analyzer--function
+ (lambda (index)
+ (let* ((string '((a 1 . 2) (b 2 . 3) (a 3 . 4) (a 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))))
+ (setq
+ parser-generator-lex-analyzer--get-function
+ (lambda (token)
+ (car token)))
+ (parser-generator-ll-parse)
+ (should
+ (equal
+ '(1 2 0) ;; Example is indexed from 1 so that is why they have '(2 3 1)
+ (parser-generator-ll-parse)))
+ ;; TODO Test example 5.5 p. 340
(message "Passed tests for (parser-generator-ll-parse)"))
- [elpa] externals/parser-generator 7b77032f71 22/82: Parser table generation for LLk now works for productions, (continued)
- [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, 2022/05/12
- [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 <=
- [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
- [elpa] externals/parser-generator 2598402cc7 56/82: Added TODO item, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 7f3c384b6d 55/82: Passing more LLk tests, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 0856bb7784 58/82: Started on refactor were k=1 will be treated with different algorithm, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 2181545d26 64/82: Implemented test for validation of LL(1) grammar, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 4051737aeb 65/82: Added TODO item for LL(k) translation, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 08af836006 69/82: More work on SDT for LL grammar, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 7d87a2d154 79/82: Implemented exported LL(k) and LL(1) parser, Christian Johansson, 2022/05/12