[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator b072fdd 175/434: Passed test for trail
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator b072fdd 175/434: Passed test for trailing e-identifier in EFF function |
Date: |
Mon, 29 Nov 2021 15:59:35 -0500 (EST) |
branch: externals/parser-generator
commit b072fdd1035db5bc2ec898c31e7d1082bb779e46
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Passed test for trailing e-identifier in EFF function
---
parser-generator.el | 120 ++++++++++++++++++++++++------------------
test/parser-generator-test.el | 19 ++++++-
2 files changed, 86 insertions(+), 53 deletions(-)
diff --git a/parser-generator.el b/parser-generator.el
index 7c24819..020d604 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -580,6 +580,58 @@
"For sentential string Α, Calculate e-free-first k terminals in grammar."
(parser-generator--first α t))
+(defun parser-generator--generate-f-sets ()
+ "Generate F-sets for grammar."
+ ;; Generate F-sets only once per grammar
+ (unless (and
+ parser-generator--f-sets
+ parser-generator--f-free-sets)
+ (let ((productions (parser-generator--get-grammar-productions))
+ (k parser-generator--look-ahead-number))
+ (let ((i-max (length productions))
+ (disallow-set '(nil t)))
+ (dolist (disallow-e-first disallow-set)
+ (let ((f-sets (make-hash-table :test 'equal))
+ (i 0))
+ (while (< i i-max)
+ (parser-generator--debug (message "i = %s" i))
+ (let ((f-set (make-hash-table :test 'equal)))
+
+ ;; Iterate all productions, set F_i
+ (dolist (p productions)
+ (let ((production-lhs (car p))
+ (production-rhs (cdr p)))
+ (parser-generator--debug
+ (message "Production: %s -> %s" production-lhs
production-rhs))
+
+ ;; Iterate all blocks in RHS
+ (let ((f-p-set))
+ (dolist (rhs-p production-rhs)
+ (let ((rhs-string rhs-p))
+ (let ((rhs-leading-terminals
+ (parser-generator--f-set rhs-string `(,k ,i
,f-sets ,disallow-e-first) '(("" t 0)))))
+ (parser-generator--debug
+ (message "Leading %d terminals at index %s (%s)
-> %s = %s" k i production-lhs rhs-string rhs-leading-terminals))
+ (when rhs-leading-terminals
+ (when (and
+ (listp rhs-leading-terminals)
+ (> (length rhs-leading-terminals) 0))
+ (dolist (rhs-leading-terminals-element
rhs-leading-terminals)
+ (push rhs-leading-terminals-element
f-p-set)))))))
+
+ ;; Make set distinct
+ (setq f-p-set (parser-generator--distinct f-p-set))
+ (parser-generator--debug
+ (message "F_%s_%s(%s) = %s" i k production-lhs f-p-set))
+ (puthash production-lhs (nreverse f-p-set) f-set))))
+ (puthash i f-set f-sets)
+ (setq i (+ i 1))))
+ (if disallow-e-first
+ (setq parser-generator--f-free-sets f-sets)
+ (setq parser-generator--f-sets f-sets)))))
+ (parser-generator--debug
+ (message "Generated F-sets")))))
+
;; p. 358
(defun parser-generator--f-set (input-tape state stack)
"A deterministic push-down transducer (DPDT) for building F-sets from
INPUT-TAPE, STATE and STACK."
@@ -705,8 +757,10 @@
((equal rhs-type 'EMPTY)
(if disallow-e-first
- (when (= leading-terminals-count 0)
- (setq all-leading-terminals-p nil))
+ (if (= leading-terminals-count 0)
+ (setq all-leading-terminals-p nil)
+ (setq leading-terminals (append leading-terminals
rhs-element))
+ (setq leading-terminals-count (1+
leading-terminals-count)))
(when (and
(= leading-terminals-count 0)
(= input-tape-index (1- input-tape-length)))
@@ -736,54 +790,7 @@
(let ((i-max (length productions)))
;; Generate F-sets only once per grammar
- (when (or
- (and
- (not disallow-e-first)
- (not parser-generator--f-sets))
- (and
- disallow-e-first
- (not parser-generator--f-free-sets)))
- (let ((f-sets (make-hash-table :test 'equal))
- (i 0))
- (while (< i i-max)
- (parser-generator--debug (message "i = %s" i))
- (let ((f-set (make-hash-table :test 'equal)))
-
- ;; Iterate all productions, set F_i
- (dolist (p productions)
- (let ((production-lhs (car p))
- (production-rhs (cdr p)))
- (parser-generator--debug
- (message "Production: %s -> %s" production-lhs
production-rhs))
-
- ;; Iterate all blocks in RHS
- (let ((f-p-set))
- (dolist (rhs-p production-rhs)
- (let ((rhs-string rhs-p))
- (let ((rhs-leading-terminals
- (parser-generator--f-set rhs-string `(,k ,i
,f-sets ,disallow-e-first) '(("" t 0)))))
- (parser-generator--debug
- (message "Leading %d terminals at index %s (%s) ->
%s = %s" k i production-lhs rhs-string rhs-leading-terminals))
- (when rhs-leading-terminals
- (when (and
- (listp rhs-leading-terminals)
- (> (length rhs-leading-terminals) 0))
- (dolist (rhs-leading-terminals-element
rhs-leading-terminals)
- (push rhs-leading-terminals-element
f-p-set)))))))
-
- ;; Make set distinct
- (setq f-p-set (parser-generator--distinct f-p-set))
- (parser-generator--debug
- (message "F_%s_%s(%s) = %s" i k production-lhs f-p-set))
- (puthash production-lhs (nreverse f-p-set) f-set))))
- (puthash i f-set f-sets)
- (setq i (+ i 1))))
- (if disallow-e-first
- (setq parser-generator--f-free-sets f-sets)
- (setq parser-generator--f-sets f-sets))))
-
- (parser-generator--debug
- (message "Generated F-sets"))
+ (parser-generator--generate-f-sets)
(let ((first-list nil))
;; Iterate each symbol in β using a PDA algorithm
@@ -806,6 +813,15 @@
(parser-generator--debug
(message "symbol index: %s from %s is: %s"
input-tape-index input-tape symbol))
(cond
+ ((parser-generator--valid-e-p symbol)
+ (if disallow-e-first
+ (when (> first-length 0)
+ (setq first (append first (list symbol)))
+ (setq first-length (1+ first-length)))
+ (setq first (append first (list symbol)))
+ (setq first-length (1+ first-length)))
+ (setq keep-looking nil))
+
((parser-generator--valid-terminal-p symbol)
(setq first (append first (list symbol)))
(setq first-length (1+ first-length)))
@@ -814,7 +830,9 @@
(parser-generator--debug
(message "non-terminal symbol: %s" symbol))
(let ((symbol-f-set))
- (if disallow-e-first
+ (if (and
+ disallow-e-first
+ (= first-length 0))
(setq symbol-f-set (gethash symbol (gethash (1-
i-max) parser-generator--f-free-sets)))
(setq symbol-f-set (gethash symbol (gethash (1-
i-max) parser-generator--f-sets))))
(parser-generator--debug
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index bb9f33e..a355942 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -324,13 +324,28 @@
(parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e))
Sp))
(parser-generator-set-look-ahead-number 1)
(parser-generator-process-grammar)
- (should
+ (should
(equal
nil
(parser-generator--e-free-first '(S b a))))
(message "Passed empty-free-first 1 with complex grammar 2")
- ;; TODO Test cases with trailing e-identifier here
+ (parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e))
Sp))
+ (parser-generator-set-look-ahead-number 2)
+ (parser-generator-process-grammar)
+ (should
+ (equal
+ '((a b))
+ (parser-generator--e-free-first '(a b))))
+ (should
+ (equal
+ '((a e))
+ (parser-generator--e-free-first '(a e))))
+ (should
+ (equal
+ '((a e))
+ (parser-generator--e-free-first '(a S))))
+ (message "Passed empty-free-first 2 with trailing e-identifier")
(message "Passed tests for (parser-generator--empty-free-first)"))
- [elpa] externals/parser-generator 4ef0430 133/434: White-space fix, (continued)
- [elpa] externals/parser-generator 4ef0430 133/434: White-space fix, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b2fd896 136/434: Added support for indexed tokens, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4746c64 137/434: Updated example for LR parse with indexed tokens, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 04a3ec5 141/434: Added separate file for syntax analysis, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 71e4eaa 145/434: Merge branch 'master' of git.cvj.se:/home/git/emacs-parser-generator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 173fe94 152/434: Preparations for translation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator be557ba 013/434: More work on refactor, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fdbdff7 157/434: Added unit test for SDT in LR-parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2d56ab0 160/434: Made separate functions for parse and translate in LR-parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7cfdea2 165/434: Passing tests for incremental lexer, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b072fdd 175/434: Passed test for trailing e-identifier in EFF function,
ELPA Syncer <=
- [elpa] externals/parser-generator d435e50 122/434: Passing unit test for LR-parse, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a31da28 173/434: Updated Parser WIP items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator aaec6fa 189/434: Work on e-free first tests, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 922033f 198/434: Various stuff, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fe10d4a 196/434: Passed tests for first 3 and first 4 of complex grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4cba5aa 203/434: Made new TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ef60d96 204/434: Added failing test for new function the generates grammar prefixes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 76e30f1 210/434: Sorted lines in test file, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e88abf0 117/434: More work on parser, added error-handling, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8328ab3 130/434: Added unit test for failing LRk Grammar Parse, ELPA Syncer, 2021/11/29