[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 3e096f7 258/434: Improved translation
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 3e096f7 258/434: Improved translation handling for each production |
Date: |
Mon, 29 Nov 2021 15:59:53 -0500 (EST) |
branch: externals/parser-generator
commit 3e096f7330b8447cf6c6917f7176c8ba76e26427
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Improved translation handling for each production
---
parser-generator.el | 173 +++++++++++++++++++++++++++++----------
test/parser-generator-lr-test.el | 4 +-
test/parser-generator-test.el | 12 ++-
3 files changed, 142 insertions(+), 47 deletions(-)
diff --git a/parser-generator.el b/parser-generator.el
index 62a9f3b..8f72da7 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -11,7 +11,7 @@
(defvar parser-generator--debug
- t
+ nil
"Whether to print debug messages or not.")
(defvar parser-generator--e-identifier
@@ -827,6 +827,7 @@
(message "rhs-expanded-full flagged negative"))
(setq rhs-expanded-full nil)
(setq expanded-all nil))
+
(setq rhs-leading-terminals
(nth 1 f-set-return))
@@ -847,16 +848,22 @@
(listp rhs-leading-terminals)
(> (length rhs-leading-terminals) 0))
(dolist
- (rhs-leading-terminals-element
rhs-leading-terminals)
+ (rhs-leading-terminals-element
+ rhs-leading-terminals)
(push
rhs-leading-terminals-element
f-p-set)))))))
;; If we have multiple equal LHS
;; merge them
- (when (gethash production-lhs f-set)
+ (when (
+ gethash
+ production-lhs
+ f-set)
(let ((existing-f-set
- (gethash production-lhs f-set)))
+ (gethash
+ production-lhs
+ f-set)))
;; If another set has not been fully expanded
;; mark LHS as not fully expanded
@@ -870,29 +877,54 @@
(nth 1 existing-f-set)))))
;; Make set distinct
- (setq f-p-set (parser-generator--distinct f-p-set))
+ (setq
+ f-p-set
+ (parser-generator--distinct f-p-set))
+ (puthash
+ production-lhs
+ (list
+ rhs-expanded-full
+ (reverse f-p-set))
+ f-set)
(parser-generator--debug
(message
- "F_%s(%s) = %s"
+ "F_%s%s = %s"
i
production-lhs
- (list rhs-expanded-full (reverse f-p-set))))
- (puthash
- production-lhs
- (list rhs-expanded-full (reverse f-p-set))
- f-set))))
+ (gethash
+ production-lhs
+ f-set))))))
- (puthash i f-set f-sets)
- (setq i (+ i 1))))
+ (puthash
+ i
+ f-set
+ f-sets)
+ (setq
+ i
+ (+ i 1))))
(if disallow-e-first
(progn
+ (setq
+ parser-generator--f-free-sets
+ (gethash
+ (1- i)
+ f-sets))
(parser-generator--debug
- (message "Max-index: %s" (1- i)))
- (setq parser-generator--f-free-sets (gethash (1- i) f-sets)))
+ (message
+ "E-FREE-FIRST max-index: %s, contents: %s"
+ (1- i)
+ parser-generator--f-free-sets)))
+ (setq
+ parser-generator--f-sets
+ (gethash
+ (1- i)
+ f-sets))
(parser-generator--debug
- (message "Max-index: %s" (1- i)))
- (setq parser-generator--f-sets (gethash (1- i) f-sets)))))))
+ (message
+ "FIRST max-index: %s, contents: %s"
+ (1- i)
+ parser-generator--f-sets)))))))
(parser-generator--debug
(message "Generated F-sets"))))
@@ -996,7 +1028,9 @@
(let ((rhs-element (nth input-tape-index input-tape))
(rhs-type))
(parser-generator--debug
- (message "rhs-element: %s" rhs-element))
+ (message
+ "rhs-element: %s"
+ rhs-element))
;; Determine symbol type
(cond
@@ -1007,7 +1041,10 @@
((parser-generator--valid-terminal-p rhs-element)
(setq rhs-type 'TERMINAL))
(t (error (format "Invalid symbol %s" rhs-element))))
- (parser-generator--debug (message "rhs-type: %s" rhs-type))
+ (parser-generator--debug
+ (message
+ "rhs-type: %s"
+ rhs-type))
(cond
@@ -1017,7 +1054,7 @@
(sub-terminal-expanded)
(sub-terminal-data
(gethash
- rhs-element
+ (list rhs-element)
(gethash
(1- i)
f-sets))))
@@ -1027,8 +1064,12 @@
rhs-element
sub-terminal-data))
- (setq sub-terminal-expanded (nth 0 sub-terminal-data))
- (setq sub-terminal-sets (nth 1 sub-terminal-data))
+ (setq
+ sub-terminal-expanded
+ (nth 0 sub-terminal-data))
+ (setq
+ sub-terminal-sets
+ (nth 1 sub-terminal-data))
;; When sub-set has not been fully expanded mark this
set
;; as not fully expanded either
@@ -1194,8 +1235,13 @@
(setq all-leading-terminals-p nil)))))
(parser-generator--debug
- (message "Found no subsets for %s %s" rhs-element
(1- i)))
- (setq all-leading-terminals-p nil)))
+ (message
+ "Found no subsets for %s %s"
+ rhs-element
+ (1- i)))
+ (setq
+ all-leading-terminals-p
+ nil)))
(parser-generator--debug
(message
@@ -1311,6 +1357,11 @@
((parser-generator--valid-non-terminal-p symbol)
(parser-generator--debug
(message "non-terminal symbol: %s" symbol))
+ (setq
+ symbol
+ (list symbol))
+ (parser-generator--debug
+ (message "non-terminal symbol production: %s" symbol))
(let ((symbol-f-set))
;; Load the pre-generated F-set
@@ -1319,18 +1370,37 @@
(if (and
disallow-e-first
(= first-length 0))
- (setq
- symbol-f-set
- (nth 1
- (gethash
- symbol
- parser-generator--f-free-sets)))
+ (progn
+ (parser-generator--debug
+ (message
+ "gethash: %s"
+ (gethash
+ symbol
+ parser-generator--f-free-sets)))
+ (setq
+ symbol-f-set
+ (nth
+ 1
+ (gethash
+ symbol
+ parser-generator--f-free-sets))))
+ (parser-generator--debug
+ (message
+ "gethash: %s"
+ (gethash
+ symbol
+ parser-generator--f-sets)))
(setq
symbol-f-set
- (nth 1
- (gethash symbol parser-generator--f-sets))))
+ (nth
+ 1
+ (gethash
+ symbol
+ parser-generator--f-sets))))
(parser-generator--debug
- (message "symbol-f-set: %s" symbol-f-set))
+ (message
+ "symbol-f-set: %s"
+ symbol-f-set))
(if (and
(not symbol-f-set)
@@ -1344,16 +1414,31 @@
(setq keep-looking nil))
;; Handle this scenario here were a non-terminal can
result in different FIRST sets
- (when (> (length symbol-f-set) 1)
- (let ((symbol-f-set-index 1)
- (symbol-f-set-length (length symbol-f-set)))
- (while (< symbol-f-set-index symbol-f-set-length)
- (let ((symbol-f-set-element (nth
symbol-f-set-index symbol-f-set)))
- (let ((alternative-first-length (+
first-length (length symbol-f-set-element)))
- (alternative-first (append first
symbol-f-set-element))
- (alternative-tape-index (1+
input-tape-index)))
+ (when (>
+ (length symbol-f-set)
+ 1)
+ (let ((symbol-f-set-index
+ 1)
+ (symbol-f-set-length
+ (length symbol-f-set)))
+ (while
+ (<
+ symbol-f-set-index
+ symbol-f-set-length)
+ (let ((symbol-f-set-element
+ (nth
+ symbol-f-set-index
+ symbol-f-set)))
+ (let ((alternative-first-length
+ (+ first-length (length
symbol-f-set-element)))
+ (alternative-first
+ (append first symbol-f-set-element))
+ (alternative-tape-index
+ (1+ input-tape-index)))
(parser-generator--debug
- (message "alternative-first: %s"
alternative-first))
+ (message
+ "alternative-first: %s"
+ alternative-first))
(push
`(
,alternative-tape-index
@@ -1365,7 +1450,9 @@
(1+ symbol-f-set-index)))))
(parser-generator--debug
- (message "main-symbol-f-set: %s" (car symbol-f-set)))
+ (message
+ "main-symbol-f-set: %s"
+ (car symbol-f-set)))
(setq
first-length
(+ first-length (length (car symbol-f-set))))
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index f2a3f33..5bf630e 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -686,7 +686,7 @@
(insert "abac")
(parser-generator-set-grammar
- '((Sp S R T) ("a" "b" "c") ((Sp S) (S (R S) (R)) (R ("a" "b" T
(lambda(args) (list "begin" (nth 2 args) "end")))) (T ("a" T (lambda() "test"))
("c") (e))) Sp))
+ '((Sp S R T) ("a" "b" "c") ((Sp S) (S (R S) (R)) (R ("a" "b" T
(lambda(args) (list "begin" (nth 2 args) "end")))) (T ("a" T (lambda(args)
"test")) ("c") (e))) Sp))
(parser-generator-set-look-ahead-number 2)
(parser-generator-process-grammar)
(parser-generator-lr-generate-parser-tables)
@@ -901,7 +901,7 @@
(defun parser-generator-lr-test ()
"Run test."
- ;; (setq debug-on-error t)
+ (setq debug-on-error t)
(parser-generator-lr-test--items-for-prefix)
(parser-generator-lr-test--items-valid-p)
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index 410b39a..2ab20c9 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -602,7 +602,6 @@
(parser-generator-set-grammar
'((S A B) ("a" "b") ((S A) (A ("b" "a")) (B "b" (lambda(b) (message "Was
here: %s" b)))) S))
(parser-generator-process-grammar)
-
(should (equal
'((A))
(parser-generator--get-grammar-rhs 'S)))
@@ -615,7 +614,6 @@
(parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A
"a") (A ("b" "a"))) S))
(parser-generator-process-grammar)
-
(should (equal
'((A) (B))
(parser-generator--get-grammar-rhs 'S)))
@@ -623,6 +621,16 @@
'(("a") ("b" "a"))
(parser-generator--get-grammar-rhs 'A)))
+ (parser-generator-set-grammar
+ '((Sp S R T) ("a" "b" "c") ((Sp S) (S (R S) (R)) (R ("a" "b" T
(lambda(args) (list "begin" (nth 2 args) "end")))) (T ("a" T (lambda() "test"))
("c") (e))) Sp))
+ (parser-generator-process-grammar)
+ (should
+ (equal
+ '(("a" T) ("c") (e))
+ (parser-generator--get-grammar-rhs 'T)))
+
+ (parser-generator-process-grammar)
+
(message "Passed tests for (parser-generator--get-grammar-rhs)"))
(defun parser-generator-test--valid-non-terminal-p ()
- [elpa] externals/parser-generator 98c9d94 213/434: Debugging parse with look-ahead > 1, (continued)
- [elpa] externals/parser-generator 98c9d94 213/434: Debugging parse with look-ahead > 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2b0d5b8 215/434: More debugging, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 640feed 216/434: Passing all tests for canonical LRk Parser with k = 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e5aa179 218/434: Some fixes for LRk parser k > 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2a9a23e 219/434: More debugging, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ddd5967 221/434: Passed test for nested translations, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator bc817d1 224/434: Passing all tests for k=1 again, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b2f1d7a 236/434: More debugging k > 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 16f6586 242/434: Fixed bug in lr-item generation were look-ahead was disregarded, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 36701c0 238/434: Optimized closure algorithm to only use possible next-symbols instead of iterating all symbols, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 3e096f7 258/434: Improved translation handling for each production,
ELPA Syncer <=
- [elpa] externals/parser-generator 96cd5de 259/434: Improved validation of grammar structure, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator bbdbd18 269/434: Started on test for LR Parse k=0, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 56363c1 263/434: Fixed last TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 175a579 275/434: Passed test for generation action-table LR(0) grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ecbbf21 290/434: Added test for exported translator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator cecf8fd 287/434: More TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 688e685 291/434: Lex-analyzer index is now buffer-local variable, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0702765 293/434: Added incremental unit test for exported parser/translator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 552c0c5 304/434: Using better hash-key for goto-tables generation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d0d3201 299/434: FIRST calculation now handles cyclic productions, ELPA Syncer, 2021/11/29