[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 71d213b 201/434: More work on Canonica
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 71d213b 201/434: More work on Canonical LR(k) Parser |
Date: |
Mon, 29 Nov 2021 15:59:41 -0500 (EST) |
branch: externals/parser-generator
commit 71d213bafa9d2f56dd60c8ea2fef53de480bcb69
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
More work on Canonical LR(k) Parser
---
parser-generator-lr.el | 30 ++++++++++++++++++++++--------
test/parser-generator-lr-test.el | 2 +-
2 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index e6c95db..40481da 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -153,9 +153,16 @@
(unmarked-lr-item-sets)
(marked-lr-item-sets (make-hash-table :test 'equal))
(symbols (append (parser-generator--get-grammar-non-terminals)
(parser-generator--get-grammar-terminals)))
- (table-lr-items (make-hash-table :test 'equal)))
+ (table-lr-items (make-hash-table :test 'equal))
+ (e-list))
- (let ((e-set (parser-generator-lr--items-for-prefix
parser-generator--e-identifier)))
+ (let ((e-list-index 0)
+ (e-list-length parser-generator--look-ahead-number))
+ (while (< e-list-index e-list-length)
+ (push parser-generator--e-identifier e-list)
+ (setq e-list-index (1+ e-list-index))))
+
+ (let ((e-set (parser-generator-lr--items-for-prefix e-list)))
;;(1) Place V(e) in S. The set V(e) is initially unmarked.
(push `(,lr-item-set-new-index ,e-set) unmarked-lr-item-sets)
(setq lr-item-set-new-index (1+ lr-item-set-new-index)))
@@ -327,13 +334,20 @@
;; Iterate all productions in grammar
(let ((lr-items-e)
- (start-productions (parser-generator--get-grammar-rhs start)))
+ (start-productions (parser-generator--get-grammar-rhs start))
+ (e-list))
+
+ (let ((e-list-index 0)
+ (e-list-length parser-generator--look-ahead-number))
+ (while (< e-list-index e-list-length)
+ (push parser-generator--e-identifier e-list)
+ (setq e-list-index (1+ e-list-index))))
;; (a)
(dolist (rhs start-productions)
;; Add [S -> . α] to V(e)
- (push `(,start nil ,rhs (e)) lr-items-e)
- (puthash `(,parser-generator--e-identifier ,start nil ,rhs
(,parser-generator--e-identifier)) t lr-item-exists))
+ (push `(,start nil ,rhs ,e-list) lr-items-e)
+ (puthash `(,e-list ,start nil ,rhs ,e-list) t lr-item-exists))
;; (b) Iterate every item in v-set(e), if [A -> . Bα, u] is an item
and B -> β is in P
;; then for each x in FIRST(αu) add [B -> . β, x] to v-set(e),
provided it is not already there
@@ -362,7 +376,7 @@
(parser-generator--debug
(message "rhs-rest-first: %s" rhs-rest-first))
(unless rhs-rest-first
- (setq rhs-rest-first
`((,parser-generator--e-identifier))))
+ (setq rhs-rest-first `(,e-list)))
(let ((sub-production
(parser-generator--get-grammar-rhs rhs-first)))
(parser-generator--debug
(message "sub-production: %s" sub-production))
@@ -372,7 +386,7 @@
;; Set follow to nil if it's the e-identifier
(when (and
- (= (length sub-rhs) 1)
+ (>= (length sub-rhs) 1)
(parser-generator--valid-e-p (car
sub-rhs)))
(setq sub-rhs nil))
@@ -401,7 +415,7 @@
;; Only do this step if prefix is not the e-identifier
(let ((prefix-previous lr-items-e))
(unless (and
- (= (length γ) 1)
+ (>= (length γ) 1)
(parser-generator--valid-e-p (car γ)))
(dolist (prefix γ)
(let ((lr-new-item))
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index a994bcd..2d8d2c8 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -375,7 +375,7 @@
(let ((lr-items (parser-generator-lr--generate-goto-tables)))
(message "lr-items: %s" (parser-generator--hash-values-to-list lr-items t))
- ;; TODO Fix so that lr-item (Sp (S) nil (e)) instead is (Sp (S) nil (e e))
+ ;; TODO Fix so that there is an accept path in look-ahead number 2
(message "goto-tables: %s" (parser-generator--hash-values-to-list
parser-generator-lr--goto-tables t))
(parser-generator-lr--generate-action-tables lr-items)
- [elpa] externals/parser-generator bbcb22f 182/434: Optimized memory usage for f-sets, (continued)
- [elpa] externals/parser-generator bbcb22f 182/434: Optimized memory usage for f-sets, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e2f4347 183/434: More work on f-set generation with e-identifiers, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 046e239 187/434: Passing first 3 complex tests for first, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4811521 185/434: Various tweakings, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7b6c1dc 186/434: First function passing first complex grammar test, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7e96f9d 188/434: Passing all unit tests for first function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7a90a75 190/434: Updated max interation count, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 796b41b 192/434: Passed unit tests for follow function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 33634dd 193/434: Passing all tests after refactor, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ba8e501 194/434: Added failing first test with complex case, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 71d213b 201/434: More work on Canonical LR(k) Parser,
ELPA Syncer <=
- [elpa] externals/parser-generator d7ad86c 200/434: Added TODO item for LRk Canonical Parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7a175a8 205/434: Passed first unit test for grammar prefixes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 517ed12 212/434: Passing some more unit tests after refactor, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f4ba363 031/434: Improved README.md, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 744fdf6 174/434: Added TODO item, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d360e8a 176/434: Added failing unit test for FIRST function with starting e-identifier, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator c1cdf20 197/434: Fixed issue with lex analyzer reached end of input, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 446cbe9 217/434: Refactored unit tests and separated k=2 case, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 1818b9d 199/434: Added error in action-tables generation if no accept action is found, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 54857e4 220/434: Added failing unit test for translation via LRk, ELPA Syncer, 2021/11/29