branch: externals/parser-generator commit f23bc217d88396de39ec0dc4ec344ca027bcee01 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
More wrestling --- parser-generator-ll.el | 12 ++++++++---- parser-generator.el | 30 ++++++++++++++++++++---------- test/parser-generator-ll-test.el | 2 +- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index 82f4e383f7..95816fd0d7 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -91,21 +91,24 @@ look-aheads (parser-generator--merge-max-terminal-sets first-rhs - nil))) + nil + t))) ((and first-parent-follow (not first-rhs)) (setq look-aheads (parser-generator--merge-max-terminal-sets nil - first-parent-follow))) + first-parent-follow + t))) ((and first-rhs first-parent-follow) (setq look-aheads (parser-generator--merge-max-terminal-sets first-rhs - first-parent-follow))) + first-parent-follow + t))) (t (error "Unexpected empty FIRST for production: %S and parent-follow: %S" production @@ -409,7 +412,8 @@ (let ((merged-terminal-sets (parser-generator--merge-max-terminal-sets first-sub-symbol-rhs - first-local-follow-sets))) + first-local-follow-sets + t))) (parser-generator--debug (message "sub-symbol-rhs: %S" sub-symbol-rhs) (message "first-sub-symbol-rhs: %S" first-sub-symbol-rhs) diff --git a/parser-generator.el b/parser-generator.el index 602391eb10..05e637536f 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -1238,8 +1238,8 @@ look-ahead))) (nreverse look-ahead))) -(defun parser-generator--merge-max-terminal-sets (a b) - "Calculate list of all lists of L1 (+) L2 which is a merge of all terminals in lists A combined with all terminals in lists B but with maximum length of the set look-ahead number." +(defun parser-generator--merge-max-terminal-sets (a b &optional abort-on-e-identifier) + "Calculate list of all lists of L1 (+) L2 which is a merge of all terminals in lists A combined with all terminals in lists B but with maximum length of the set look-ahead number, optionally ABORT-ON-E-IDENTIFIER." (let ((a-length (length a)) (a-index 0) (b-length (length b)) @@ -1255,7 +1255,8 @@ ((merged-element (parser-generator--merge-max-terminals a-element - b-element))) + b-element + abort-on-e-identifier))) (if merged-lists (setq merged-lists @@ -1274,7 +1275,8 @@ ((merged-element (parser-generator--merge-max-terminals a-element - nil))) + nil + abort-on-e-identifier))) (if merged-lists (setq merged-lists @@ -1294,7 +1296,8 @@ ((merged-element (parser-generator--merge-max-terminals nil - b-element))) + b-element + abort-on-e-identifier))) (if merged-lists (setq merged-lists @@ -1317,8 +1320,8 @@ merged-lists)) ;; Lemma 5.1 p. 348 -(defun parser-generator--merge-max-terminals (a b) - "Calculate L1 (+) L2 which is a merge of all terminals in A and B but with exactly length of the set look-ahead number." +(defun parser-generator--merge-max-terminals (a b &optional abort-on-e-identifier) + "Calculate L1 (+) L2 which is a merge of all terminals in A and B but with exactly length of the set look-ahead number, optionally ABORT-ON-E-IDENTIFIER." (let ((k (max 1 parser-generator--look-ahead-number)) (merged) (merge-count 0) @@ -1327,20 +1330,27 @@ (a-length (length a)) (b-element) (b-index 0) - (b-length (length b))) + (b-length (length b)) + (continue t)) (while (and + continue (< a-index a-length) (< merge-count k)) (setq a-element (nth a-index a)) - (unless (parser-generator--valid-e-p a-element) + (if (parser-generator--valid-e-p a-element) + (when abort-on-e-identifier + (setq continue nil)) (push a-element merged) (setq merge-count (1+ merge-count))) (setq a-index (1+ a-index))) (while (and + continue (< b-index b-length) (< merge-count k)) (setq b-element (nth b-index b)) - (unless (parser-generator--valid-e-p b-element) + (if (parser-generator--valid-e-p b-element) + (when abort-on-e-identifier + (setq continue nil)) (push b-element merged) (setq merge-count (1+ merge-count))) (setq b-index (1+ b-index))) diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el index 6f103ef8f8..e1f88745f9 100644 --- a/test/parser-generator-ll-test.el +++ b/test/parser-generator-ll-test.el @@ -33,7 +33,7 @@ ) (parser-generator-process-grammar) (let ((tables (parser-generator-ll--generate-tables))) - (message "tables: %S" tables) + (message "tables 1: %S" tables) (should (equal tables