branch: externals/parser-generator commit d1f46827a56fa1307fd4b2c435efef0b6262b628 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added a function that converts a FIRST-item to a look-ahead item --- parser-generator-lr.el | 13 ++++++++++--- parser-generator.el | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/parser-generator-lr.el b/parser-generator-lr.el index 1def311..7cc030e 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -95,15 +95,22 @@ (while (and searching-match (< eff-index eff-length)) - (setq eff-item (nth eff-index eff)) - (if (parser-generator--valid-look-ahead-p eff-item) + (setq + eff-item + (parser-generator--first-to-lookahead + (nth eff-index eff))) + (if + (parser-generator--valid-look-ahead-p + eff-item) (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))) (parser-generator--debug - (message "Not valid look-ahead: %s" eff-item))) + (message + "Not valid look-ahead: %s" + eff-item))) (setq eff-index (1+ eff-index))) (unless searching-match diff --git a/parser-generator.el b/parser-generator.el index 296cc0a..9ab4716 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -827,6 +827,20 @@ (parser-generator--debug (message "Generated F-sets")))) +(defun parser-generator--first-to-lookahead (first) + "Replace all e-identifiers with eof-identifiers in FIRST." + (let ((look-ahead)) + (dolist (symbol first) + (if (parser-generator--valid-e-p + symbol) + (push + parser-generator--eof-identifier + look-ahead) + (push + symbol + look-ahead))) + (nreverse look-ahead))) + (defun parser-generator--merge-max-terminals (a b k) "Merge terminals from A and B to a maximum length of K." (let ((merged)