[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 7b77032f71 22/82: Parser table generat
From: |
Christian Johansson |
Subject: |
[elpa] externals/parser-generator 7b77032f71 22/82: Parser table generation for LLk now works for productions |
Date: |
Thu, 12 May 2022 13:28:14 -0400 (EDT) |
branch: externals/parser-generator
commit 7b77032f7179d7911d04db1be725b03622de153a
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Parser table generation for LLk now works for productions
---
parser-generator-ll.el | 52 ++++++++++++++++++++++++++++++----------
test/parser-generator-ll-test.el | 18 +++++++-------
2 files changed, 49 insertions(+), 21 deletions(-)
diff --git a/parser-generator-ll.el b/parser-generator-ll.el
index 5ec448db43..6c2410a2e3 100644
--- a/parser-generator-ll.el
+++ b/parser-generator-ll.el
@@ -234,6 +234,7 @@
(value (nth 1 table))
(key-stack-symbol (car (nth 0 key)))
(key-parent-follow-set (nth 1 key))
+ (left-hand-side (nth 0 key))
(parse-table))
(dolist (look-ahead-row value)
(let* ((look-ahead (nth 0 look-ahead-row))
@@ -241,21 +242,48 @@
(local-follow-sets (nth 2 look-ahead-row))
(non-terminal-index 0)
(sub-symbol-index 0)
- (sub-symbol-length (length right-hand-side)))
- (while (< sub-symbol-index sub-symbol-length)
- (let ((sub-symbol (nth sub-symbol-index right-hand-side)))
- (when (parser-generator--valid-non-terminal-p
+ (sub-symbol-length (length right-hand-side))
+ (production (list left-hand-side right-hand-side))
+ (production-number
+ (parser-generator--get-grammar-production-number
+ production))
+ (modified-right-hand-side))
+ (while (< sub-symbol-index sub-symbol-length)
+ (let ((sub-symbol (nth sub-symbol-index right-hand-side)))
+ (if (parser-generator--valid-non-terminal-p
sub-symbol)
- (let ((local-follow (nth non-terminal-index
local-follow-sets)))
- )
- (setq
- non-terminal-index
- (1+ non-terminal-index))))
+ (let ((local-follow (nth non-terminal-index
local-follow-sets)))
+ (push
+ (list
+ (list sub-symbol)
+ local-follow)
+ modified-right-hand-side)
+ (setq
+ non-terminal-index
+ (1+ non-terminal-index)))
+ (push
+ sub-symbol
+ modified-right-hand-side)))
+ (setq
+ sub-symbol-index
+ (1+ sub-symbol-index)))
(setq
- sub-symbol-index
- (1+ sub-symbol-index)))))))
+ modified-right-hand-side
+ (reverse modified-right-hand-side))
+
+ (push
+ (list
+ look-ahead
+ 'reduce
+ modified-right-hand-side
+ production-number)
+ parse-table)))
+ (push
+ (list
+ key
+ parse-table)
+ parsing-table)))
- ;;
;; (2) M(a, av) = pop for all v in E where |E| = k-1 -> move to parser
logic
;; (3) M($, e) = accept -> move to parser logic
diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el
index 7a5f86dbe2..01bbe32066 100644
--- a/test/parser-generator-ll-test.el
+++ b/test/parser-generator-ll-test.el
@@ -102,7 +102,7 @@
(parser-tables
(parser-generator-ll--generate-parsing-table
tables)))
- (message "parser-tables: %S" parser-tables)
+ ;; (message "parser-tables: %S" parser-tables)
;; TODO Make this pass
(should
@@ -111,23 +111,23 @@
(
((S) nil) ;; T0
(
- ((a a) reduce (a ((A) (a a)) a a) 1)
- ((a b) reduce (a ((A) (a a)) a a) 1)
- ((b b) reduce (b ((A) (b a)) b a) 2)
+ ((b b) reduce (b ((A) (b a)) b a) 1)
+ ((a a) reduce (a ((A) (a a)) a a) 0)
+ ((a b) reduce (a ((A) (a a)) a a) 0)
)
)
(
((A) (a a)) ;; T1
(
- ((a a) reduce (e) 4)
- ((b a) reduce (b) 3)
+ ((b a) reduce (b) 2)
+ ((a a) reduce (e) 3)
)
)
(
- ((A) (a b)) ;; T2
+ ((A) (b a)) ;; T2
(
- ((b a) reduce (e) 4)
- ((b b) reduce (b) 3)
+ ((b a) reduce (e) 3)
+ ((b b) reduce (b) 2)
)
)
)
- [elpa] externals/parser-generator 020969094c 61/82: More refactoring, (continued)
- [elpa] externals/parser-generator 020969094c 61/82: More refactoring, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 08ed55d35a 62/82: More work on k=1, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 4f85cc5616 66/82: Passes byte-compilation tests, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 7a265c9a84 67/82: LL-tests now runs on make tests command, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator a046c8584d 73/82: Started on documentation for LL(k) and LL(1), Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator f07939a440 76/82: Added example from Wikipedia and passing test, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 03a11c4369 14/82: Started test for LL(k) parser-table generation, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 9d6ca94d0e 02/82: More work on LL(k) parser, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 6ce0dd9429 04/82: Improved function to calculate merge max terminal sets, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 52734d7160 16/82: Updated TODO items, Christian Johansson, 2022/05/12
- [elpa] externals/parser-generator 7b77032f71 22/82: Parser table generation for LLk now works for productions,
Christian Johansson <=
- [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, 2022/05/12