branch: externals/parser-generator commit 878b2900f29fecf79736b5c917a912b98747217b Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Improved calculation of merged max terminals when one of the set is undefined --- parser-generator-ll.el | 6 +++--- parser-generator.el | 56 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index bdbc0ca76a..219a1424ae 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -64,14 +64,14 @@ (not first-dot-look-ahead)) (setq look-aheads - (parser-generator--merge-max-terminals + (parser-generator--merge-max-terminal-sets first-production nil))) ((and first-dot-look-ahead (not first-production)) (setq look-aheads - (parser-generator--merge-max-terminals + (parser-generator--merge-max-terminal-sets nil first-dot-look-ahead))) ((and first-production @@ -80,7 +80,7 @@ look-aheads (parser-generator--merge-max-terminal-sets first-production - first-dot-look-ahead)))) + first-dot-look-ahead))) (t (error "Unexpected empty FIRST for production: %S and dot-look-ahead: %S" production diff --git a/parser-generator.el b/parser-generator.el index 5cf4d9374f..c8cb20166a 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -1232,20 +1232,57 @@ (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." - (let ((a-length - (length a)) + (let ((a-length (length a)) (a-index 0) - (b-length - (length b)) + (b-length (length b)) (merged-lists)) - (while (< a-index a-length) - (let ((a-element (nth a-index a)) - (b-index 0)) + (cond + ((and a b) + (while (< a-index a-length) + (let ((a-element (nth a-index a)) + (b-index 0)) + (while (< b-index b-length) + (let ((b-element (nth b-index b))) + (let ((merged-element + (parser-generator--merge-max-terminals + a-element + b-element))) + (if merged-lists + (setq + merged-lists + (append + merged-lists + (list merged-element))) + (setq + merged-lists + (list merged-element))))) + (setq b-index (1+ b-index))) + (setq a-index (1+ a-index))))) + (a + (while (< a-index a-length) + (let ((a-element (nth a-index a))) + (let ((merged-element + (parser-generator--merge-max-terminals + a-element + nil))) + (if merged-lists + (setq + merged-lists + (append + merged-lists + (list merged-element))) + (setq + merged-lists + (list merged-element))))) + (setq a-index (1+ a-index)))) + + (b + (let ((b-index 0)) (while (< b-index b-length) (let ((b-element (nth b-index b))) (let ((merged-element (parser-generator--merge-max-terminals - a-element + nil b-element))) (if merged-lists (setq @@ -1256,8 +1293,7 @@ (setq merged-lists (list merged-element))))) - (setq b-index (1+ b-index))) - (setq a-index (1+ a-index)))) + (setq b-index (1+ b-index)))))) (setq merged-lists (parser-generator--distinct