[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 8a6b752 208/434: Starting on adding su
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 8a6b752 208/434: Starting on adding support for LR k > 1 parser |
Date: |
Mon, 29 Nov 2021 15:59:42 -0500 (EST) |
branch: externals/parser-generator
commit 8a6b752f556e5438499003079c621e07080904a5
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Starting on adding support for LR k > 1 parser
---
parser-generator-lr.el | 77 +++++++++++++++++++++++++-------------------------
parser-generator.el | 9 ++++++
2 files changed, 48 insertions(+), 38 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 2e6c207..a7ff3de 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -153,17 +153,17 @@
(goto-table)
(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)))
+ (symbols
+ (parser-generator--get-list-permutations
+ (append
+ (parser-generator--get-grammar-non-terminals)
+ (parser-generator--get-grammar-terminals))
+ parser-generator--look-ahead-number))
(table-lr-items (make-hash-table :test 'equal))
- (e-list))
-
- ;; TODO Verify what symbols should consist of if k > 1
-
- (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))))
+ (e-list
+ (parser-generator--generate-list-of-symbol
+ parser-generator--look-ahead-number
+ parser-generator--e-identifier)))
(let ((e-set (parser-generator-lr--items-for-prefix e-list)))
;;(1) Place V(e) in S. The set V(e) is initially unmarked.
@@ -339,13 +339,9 @@
;; Iterate all productions in grammar
(let ((lr-items-e)
(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))))
+ (e-list (parser-generator--generate-list-of-symbol
+ parser-generator--look-ahead-number
+ parser-generator--e-identifier)))
;; (a)
(dolist (rhs start-productions)
@@ -560,7 +556,11 @@
(error "Missing GOTO-tables for grammar!"))
(let ((accept)
- (pre-index 0))
+ (pre-index 0)
+ (e-list (parser-generator--generate-list-of-symbol
+ parser-generator--look-ahead-number
+ parser-generator--e-identifier)))
+
(while (not accept)
;; (message "output: %s, index: %s" output
parser-generator-lex-analyzer--index)
@@ -617,14 +617,15 @@
;; (c) If f(u) = error, we halt parsing (and, in practice
;; transfer to an error recovery routine).
- (error (format
- "Invalid syntax! Expected one of %s found %s at index
%s "
- possible-look-aheads
- look-ahead
- parser-generator-lex-analyzer--index)
- possible-look-aheads
- look-ahead
- parser-generator-lex-analyzer--index))
+ (error
+ (format
+ "Invalid syntax! Expected one of %s found %s at index %s "
+ possible-look-aheads
+ look-ahead
+ parser-generator-lex-analyzer--index)
+ possible-look-aheads
+ look-ahead
+ parser-generator-lex-analyzer--index))
(cond
@@ -637,13 +638,12 @@
;; there is no next input symbol or g(a) is undefined, halt
;; and declare error.
- ;; TODO a and a-full needs to all tokens of look-ahead
-
- (let ((a (car look-ahead))
- (a-full (car look-ahead-full)))
+ (let ((a look-ahead)
+ (a-full look-ahead-full))
(let ((goto-table
- (gethash table-index
- parser-generator-lr--goto-tables)))
+ (gethash
+ table-index
+ parser-generator-lr--goto-tables)))
(let ((goto-table-length (length goto-table))
(goto-index 0)
(searching-match t)
@@ -665,11 +665,12 @@
(setq goto-index (1+ goto-index)))
(unless next-index
- (error (format
- "In shift, found no goto-item for %s in index
%s, expected one of %s"
- a
- table-index
- possible-look-aheads)))
+ (error
+ (format
+ "In shift, found no goto-item for %s in index %s,
expected one of %s"
+ a
+ table-index
+ possible-look-aheads)))
(push a-full pushdown-list)
(push next-index pushdown-list)
@@ -694,7 +695,7 @@
(popped-items-contents))
(unless (equal
production-rhs
- (list parser-generator--e-identifier)) ;; TODO
Verify this
+ e-list) ;; TODO Verify this
(let ((pop-items (* 2 (length production-rhs)))
(popped-items 0)
(popped-item))
diff --git a/parser-generator.el b/parser-generator.el
index b4111e3..b98f352 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -160,6 +160,15 @@
(error "No grammar G defined!")))
(nth 0 G))
+(defun parser-generator--generate-list-of-symbol (k symbol)
+ "Generate list of K number of SYMBOL."
+ (let ((list-index 0)
+ (list))
+ (while (< list-index k)
+ (push symbol list)
+ (setq list-index (1+ list-index)))
+ list))
+
(defun parser-generator--get-list-permutations (list k)
"Return all possible LIST permutations length K."
(let ((permutations)
- [elpa] externals/parser-generator fa6237a 170/434: Added TODO items, (continued)
- [elpa] externals/parser-generator fa6237a 170/434: Added TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 71f03cc 171/434: Updated example, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0b72792 177/434: Added failing unit tests for FIRST, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 181b499 178/434: Fixed bug in FIRST generation where multiple equal LHS:s, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator c4455db 179/434: Added TODO-item, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 84ffb4e 181/434: f-set max index is now set depending on if all non-terminals have been expanded or not, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4aeed22 191/434: Passed tests for e-free first function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 18d7c63 195/434: Added new function to merge lists of terminals, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 60d9968 202/434: Fixed valid look-ahead with k above 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 38223d3 206/434: Passed tests for generating grammar prefixes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8a6b752 208/434: Starting on adding support for LR k > 1 parser,
ELPA Syncer <=
- [elpa] externals/parser-generator d604092 223/434: Added failing unit test for e-free-first function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 172d530 214/434: Improved handling of production LHS to enable multiple symbols, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fbc8f8b 225/434: Removed dependency of hash-table of terminals for LR parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 870eca2 232/434: Reduced depth of GOTO-table to always use one symbol, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5b45b2b 235/434: Improved comments, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator c2d2d0d 239/434: Fixed FIRST calculating when building lr-item sets, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a516e3f 234/434: Started on new test for LR(2) Parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 06c09bc 254/434: Removed commented-out code, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a796d8d 253/434: Added another passing unit test for k=2, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b2193b2 251/434: GOTO-items now only contain one symbol in parse function, ELPA Syncer, 2021/11/29