[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator fbc8f8b 225/434: Removed dependency of
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator fbc8f8b 225/434: Removed dependency of hash-table of terminals for LR parser |
Date: |
Mon, 29 Nov 2021 15:59:46 -0500 (EST) |
branch: externals/parser-generator
commit fbc8f8ba1791833bd1acc08b7f491163be5631b6
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Removed dependency of hash-table of terminals for LR parser
---
parser-generator-lr.el | 72 +++++++++++++++++++++++++++++---------------------
1 file changed, 42 insertions(+), 30 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index f606f98..f95b2f2 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -74,29 +74,33 @@
(let
((eff
(parser-generator--e-free-first Cv)))
- (when eff
- ;; Go through eff-items and see if any item is
a valid look-ahead of grammar
- ;; in that case save in action table a shift
action here
- ;; TODO Verify that stuff like aeee is valid
look-ahead if look-ahead is 4
- (let ((eff-index 0)
- (eff-item)
- (eff-length (length eff))
- (searching-match t))
- (while (and
- searching-match
- (< eff-index eff-length))
- (setq eff-item (nth eff-index eff))
- (when
(parser-generator--valid-look-ahead-p eff-item)
- (let ((hash-key
- (format "%s-%s-%s" goto-index
state eff-item)))
- (unless (gethash hash-key
added-actions)
- (puthash hash-key t added-actions)
- (setq searching-match nil))))
- (setq eff-index (1+ eff-index)))
-
- (unless searching-match
- (push (list eff-item 'shift) action-table)
- (setq found-action t))))))))))
+ (if eff
+ ;; Go through eff-items and see if any item
is a valid look-ahead of grammar
+ ;; in that case save in action table a shift
action here
+ ;; TODO Verify that stuff like aeee is valid
look-ahead if look-ahead is 4
+ (let ((eff-index 0)
+ (eff-item)
+ (eff-length (length eff))
+ (searching-match t))
+ (while (and
+ searching-match
+ (< eff-index eff-length))
+ (setq eff-item (nth eff-index eff))
+ (if
(parser-generator--valid-look-ahead-p eff-item)
+ (let ((hash-key
+ (format "%s-%s-%s" goto-index
state eff-item)))
+ (unless (gethash hash-key
added-actions)
+ (puthash hash-key t
added-actions)
+ (setq searching-match nil)))
+ (parser-generator--debug
+ (message "Not valid look-ahead: %s"
eff-item)))
+ (setq eff-index (1+ eff-index)))
+
+ (unless searching-match
+ (push (list eff-item 'shift)
action-table)
+ (setq found-action t)))
+ (parser-generator--debug
+ (message "E-FREE-FIRST is empty for %s"
Cv)))))))))
((eq state 'reduce)
;; (b) f(u) = reduce i if [A -> B ., u] is in a and A -> B
is production i in P, i > 1
@@ -123,6 +127,8 @@
"Expecting production number for %s from
LR-item %s!"
production
lr-item))
+
+ ;; TODO Add production length here to avoid
retrieving it later
(parser-generator--debug
(message "production: %s (%s)" production
production-number)
(message "u: %s" u))
@@ -182,9 +188,9 @@
(marked-lr-item-sets
(make-hash-table :test 'equal))
(symbols
- (append
- (parser-generator--get-grammar-non-terminals)
- (parser-generator--get-grammar-terminals)))
+ (append
+ (parser-generator--get-grammar-non-terminals)
+ (parser-generator--get-grammar-terminals)))
(table-lr-items (make-hash-table :test 'equal))
(e-list
(parser-generator--generate-list-of-symbol
@@ -804,7 +810,7 @@
(setq goto-index (1+ goto-index)))
(parser-generator--debug
- (message "next-index: %s" next-index))
+ (message "next-index: %s" next-index))
(unless next-index
(error
@@ -829,6 +835,8 @@
;; the pushdown list and return to step (1)
(let ((production-number (car (cdr action-match))))
+
+ ;; TODO Remove need of this
(let ((production
(parser-generator--get-grammar-production-by-number
production-number)))
@@ -858,6 +866,8 @@
(setq popped-items (1+ popped-items)))))
(push production-number output)
+ ;; TODO Remove dependency of hash-table for productions
here
+
;; Perform translation at reduction if specified
(when
(parser-generator--get-grammar-translation-by-number
@@ -869,8 +879,9 @@
(message
"popped-item: %s"
popped-item))
- (if (parser-generator--valid-terminal-p
- (car popped-item))
+ (if (and
+ (listp popped-item)
+ (cdr popped-item))
(push
(parser-generator-lex-analyzer--get-function
popped-item)
@@ -890,6 +901,7 @@
popped-items-meta-contents
(nreverse popped-items-meta-contents))
+ ;; TODO Remove dependency of hash-table of
translations here
(let ((partial-translation
(funcall
(parser-generator--get-grammar-translation-by-number
@@ -959,7 +971,7 @@
"Parsed entire string without getting accepting! Output: %s"
(reverse output)))
(when history
- (setq history (reverse history)))
+ (setq history (reverse history)))
(when output
(setq output (reverse output)))
(list
- [elpa] externals/parser-generator 181b499 178/434: Fixed bug in FIRST generation where multiple equal LHS:s, (continued)
- [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, 2021/11/29
- [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 <=
- [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
- [elpa] externals/parser-generator d147355 256/434: Fixed a bug in processing production RHS when loading symbols, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8e3084b 270/434: More work LRk parser k = 0, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 58190dc 272/434: LR Parser k=0 building correct LR items, ELPA Syncer, 2021/11/29