branch: externals/parser-generator commit 80dd506b650acfd0f0258bc9378b404bae3ff650 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
More work on LL-helper functions --- parser-generator-ll.el | 40 ++++++++++++++++++++++++++++------------ parser-generator.el | 17 ++++++++++------- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index 973571e575..a7acf6f73e 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -47,6 +47,7 @@ (let ((tables (make-hash-table :test 'equal)) (distinct-item-p (make-hash-table :test 'equal)) (stack) + (distinct-stack-item-p (make-hash-table :test 'equal)) (stack-item) (k (max 1 parser-generator--look-ahead-number))) @@ -54,13 +55,21 @@ (let* ((start (parser-generator--get-grammar-start)) (start-rhss (parser-generator--get-grammar-rhs start))) (dolist (start-rhs start-rhss) - (let* ((production (list (list start) start-rhs))) + (let* ((production + (list (list start) start-rhs)) + (initial-stack-item + (list + (list start) + start-rhs + (list parser-generator--eof-identifier)))) + (puthash + initial-stack-item + t + distinct-stack-item-p) (push - (list - (list start) - start-rhs - (list parser-generator--eof-identifier)) + initial-stack-item stack)))) + (setq stack (nreverse stack)) (parser-generator--debug (message "stack: %S" stack)) @@ -171,13 +180,20 @@ (list sub-symbol) sub-symbol-rhs local-follow))) - (parser-generator--debug - (message - "new-stack-item: %S" - new-stack-item)) - (push - new-stack-item - stack))))))) + (unless (gethash + new-stack-item + distinct-stack-item-p) + (parser-generator--debug + (message + "new-stack-item: %S" + new-stack-item)) + (puthash + new-stack-item + t + distinct-stack-item-p) + (push + new-stack-item + stack)))))))) (setq sub-symbol-index (1+ sub-symbol-index)))) diff --git a/parser-generator.el b/parser-generator.el index e956ffc033..617d9f1088 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -2090,13 +2090,16 @@ (defun parser-generator-generate-terminal-saturated-first-set (first-set) "Generated a set from FIRST-SET with items that does not end with the e-identifier if there is alternative items that continues with terminals." - (let* ((max-terminal-count - (parser-generator-calculate-max-terminal-count - first-set)) - (saturated-list - (parser-generator-generate-sets-of-terminals - first-set - max-terminal-count))) + (let ((max-terminal-count + (parser-generator-calculate-max-terminal-count + first-set)) + (saturated-list)) + (when (> max-terminal-count 0) + (setq + saturated-list + (parser-generator-generate-sets-of-terminals + first-set + max-terminal-count))) saturated-list)) (defun parser-generator-generate-sets-of-terminals (sets count)