branch: externals/parser-generator commit 59aea4d7aaba2e9cb1293b18aba82e52de3d1308 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
More tweaking new algorithm --- parser.el | 14 ++++++++------ test/parser-test.el | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/parser.el b/parser.el index 7dab2dc..d17d072 100644 --- a/parser.el +++ b/parser.el @@ -653,8 +653,8 @@ follow-set)) ;; Algorithm 5.9, p. 389 -(defun parser--lr-items-for-grammar () - "Calculate set of valid LR(k) items for grammar." +(defun parser--lr-items-for-grammar (length) + "Calculate set of valid LR(k) items for grammar with LENGTH." (let ((prefixes) (marked-prefixes (make-hash-table :test 'equal)) (lr-items) @@ -662,14 +662,16 @@ (let ((e-set (parser--lr-items-for-prefix parser--e-identifier))) ;;(1) Place V(e) in S. The set V(e) is initially unmarked. - (push e-set lr-items) + (setq lr-items (append lr-items e-set)) (push `(,parser--e-identifier) prefixes)) ;; (3) Repeat step (2) until all sets of items in S are marked. (let ((prefix)) ;; (2) If a set of items a in S is unmarked - (while prefixes + (while (and prefixes + (> length 0)) + (setq length (1- length)) ;; (2) Mark a by computing for each X in N u E, GOTO (a, X). (Algorithm 5.8 can be used here.) (setq prefix (pop prefixes)) @@ -698,11 +700,11 @@ ;; If a' = GOTO(a, X) is nonempty (when prefix-lr-items - (message "Added to stack.") + (message "viable-prefix: %s" alternative-prefix) ;; then add a' to S as an unmarked set of items (push alternative-prefix prefixes) - (push prefix-lr-items lr-items)))))))) + (setq lr-items (append lr-items prefix-lr-items))))))))) lr-items)) diff --git a/test/parser-test.el b/test/parser-test.el index 9ca16d3..8d0b0b6 100644 --- a/test/parser-test.el +++ b/test/parser-test.el @@ -238,7 +238,7 @@ (S nil nil (a)) (S nil nil (e)) (Sp nil (S) (e))) - (parser--lr-items-for-grammar))) + (parser--lr-items-for-grammar 8))) (message "Passed LR-items for example 5.30") (message "Passed tests for (parser--lr-items-for-grammar)"))