[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 4f81d98 107/434: Sorting each row in a
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 4f81d98 107/434: Sorting each row in action-table |
Date: |
Mon, 29 Nov 2021 15:59:19 -0500 (EST) |
branch: externals/parser-generator
commit 4f81d9839ce8fadd6d05f1af0d2a3ec66be50da9
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Sorting each row in action-table
---
parser-lr.el | 60 +++++++++++++++++++++++++++++++-----------------------------
1 file changed, 31 insertions(+), 29 deletions(-)
diff --git a/parser-lr.el b/parser-lr.el
index 9a33364..87fb667 100644
--- a/parser-lr.el
+++ b/parser-lr.el
@@ -43,7 +43,8 @@
"Generate action-tables for lr-grammar."
(unless parser-lr--action-tables
(let ((action-tables)
- (states '(shift reduce accept error)))
+ (states '(shift reduce accept error))
+ (added-actions (make-hash-table :test 'equal)))
(dolist (goto-table parser-lr--goto-tables)
;; (message "goto-table: %s" goto-table)
(let ((goto-index (car goto-table))
@@ -54,12 +55,9 @@
(let ((lr-items-length (length lr-items)))
;; Where u is in (T U e)*k
(dolist (state states)
- (let ((state-in-progress t)
- (lr-item)
+ (let ((lr-item)
(lr-item-index 0))
- (while (and
- state-in-progress
- (< lr-item-index lr-items-length))
+ (while (< lr-item-index lr-items-length)
(setq lr-item (nth lr-item-index lr-items))
;; (message "lr-item: %s" lr-item)
(cond
@@ -72,11 +70,10 @@
;; (message "C: %s" C)
;; (message "v: %s" v)
(let ((Cv (append C v)))
- (message "Cv: %s" Cv)
+ ;; (message "Cv: %s" Cv)
(when Cv
(let ((eff (parser--e-free-first Cv)))
- (message "eff: %s" eff)
- ;; TODO This is not returning expected values
+ ;; (message "eff: %s" eff)
(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
@@ -91,14 +88,16 @@
;; (message "eff-item: %s" eff-item)
(when (parser--valid-look-ahead-p
eff-item)
;; (message "eff-item is a valid
look-ahead of grammar")
- (setq searching-match nil))
+ (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
- (message "%s x %s -> 'shift" goto-index
eff-item)
+ ;; (message "%s x %s -> 'shift"
goto-index eff-item)
(push (list eff-item 'shift)
action-table)
- (setq found-action t)
- (setq state-in-progress nil))))))))))
+ (setq found-action t))))))))))
((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
@@ -107,15 +106,17 @@
(not (nth 2 lr-item)))
(let ((u (nth 3 lr-item)))
(when (parser--valid-look-ahead-p u)
- (let ((production (list (nth 0 lr-item) (append
(nth 1 lr-item) (nth 2 lr-item)))))
- (let ((production-number
(parser--get-grammar-production-number production)))
- (unless production-number
- (error "Expecting production number for %s
from LR-item %s!" production lr-item))
- ;; save reduction action in action table
- (message "%s x %s -> 'reduce %s" goto-index u
production-number)
- (push (list u 'reduce production-number)
action-table)
- (setq found-action t)
- (setq state-in-progress nil)))))))
+ (let ((hash-key (format "%s-%s-%s" goto-index
state u)))
+ (unless (gethash hash-key added-actions)
+ (puthash hash-key t added-actions)
+ (let ((production (list (nth 0 lr-item)
(append (nth 1 lr-item) (nth 2 lr-item)))))
+ (let ((production-number
(parser--get-grammar-production-number production)))
+ (unless production-number
+ (error "Expecting production number for
%s from LR-item %s!" production lr-item))
+ ;; save reduction action in action table
+ ;; (message "%s x %s -> 'reduce %s"
goto-index u production-number)
+ (push (list u 'reduce production-number)
action-table)
+ (setq found-action t)))))))))
((eq state 'accept)
;; TODO (c) f(e) = accept if [S' -> S ., e] is in a
@@ -123,14 +124,15 @@
(nth 1 lr-item)
(not (nth 2 lr-item))
(eq (nth 3 lr-item) `(,parser--e-identifier)))
- ;; TODO Save in action table accept action for e
- (push (list (parser--e-identifier) 'accept)
action-table)
- (setq found-action t)
- (setq state-in-progress nil)))
+ (let ((hash-key (format "%s-%s-%s" goto-index state
parser--e-identifier)))
+ (unless (gethash hash-key added-actions)
+ (puthash hash-key t added-actions)
+ ;; TODO Save in action table accept action for e
+ (push (list (parser--e-identifier) 'accept)
action-table)
+ (setq found-action t)))))
((eq state 'error)
- (if found-action
- (setq state-in-progress nil)
+ (unless found-action
(message "%s -> 'error" lr-item)
;; TODO Save error action here?
;; TODO (d) f(u) = error otherwise
@@ -140,7 +142,7 @@
(setq lr-item-index (1+ lr-item-index)))))))
(message "%s actions %s" goto-index action-table)
(when action-table
- (push (list goto-index action-table) action-tables))))
+ (push (list goto-index (sort action-table 'parser--sort-list))
action-tables))))
(setq parser-lr--action-tables (sort (nreverse action-tables)
'parser--sort-list)))))
;; Algorithm 5.9, p. 389
- [elpa] externals/parser-generator 32e2c15 024/434: Fixed bug with e-production, (continued)
- [elpa] externals/parser-generator 32e2c15 024/434: Fixed bug with e-production, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 26bf153 037/434: Setting look-ahead-number is now separated from setting grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a54061c 055/434: Debugging of new algorithm, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 62d06a0 063/434: Passing unit test for V(Sa), ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 186d7bb 065/434: Renamed function lr-items to lr-items-for-prefix, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 9792eeb 069/434: Added TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 08b40cd 071/434: Updated header levels in README, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5da1b28 079/434: Added TODO item, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 79565f4 089/434: Fixed sorting of columns in GOTO-table, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 043e375 095/434: Refactored LR-parser into stand-alone file, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4f81d98 107/434: Sorting each row in action-table,
ELPA Syncer <=
- [elpa] externals/parser-generator 62f54f1 110/434: Added failing unit test for e-free-first function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ee0ef5d 115/434: Added failing unit test for Algorithm 5.7, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b0e9111 125/434: Started on lex-analyzer function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0416ca9 134/434: Added information about lex-analyzer in README, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b756e1a 135/434: Added example of parsing using LR algorithm, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator cee559d 139/434: Added separate document for lexical analysis documentation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator de0ed95 142/434: Updated README.md, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fa7089e 144/434: Re-factored lex analyzer function to not use length argument, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7eb9a4a 156/434: Fixed issue with indexing productions when they have SDT, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 19667b3 158/434: Added failing unit test for translation, ELPA Syncer, 2021/11/29