branch: externals/parser-generator commit 2c262a4a13c8002d498168501b3c1e6bacb76718 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added new error when there is grammar conflict in action-table generation and no precedence comparison function is defined --- parser-generator-lr.el | 83 +++++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 35 deletions(-) diff --git a/parser-generator-lr.el b/parser-generator-lr.el index 12128fa..f23e348 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -398,48 +398,61 @@ goto-index (parser-generator--get-symbols-without-attributes u)))) + (when (gethash index-hash-key index-symbols) - (let ((a u) - (b + (if + parser-generator-lr--precedence-comparison-function + (let ((a u) + (b + (gethash + index-hash-key + index-symbols))) + (if + (parser-generator-lr--symbol-takes-precedence-p + (car a) + (car b)) + (progn + (parser-generator--debug + (message + "'%s' takes precedence over '%s'" + a + b)) + ;; Remove b from added-actions + (let ((new-action-table)) + (dolist (action-item action-table) + (unless + (equal + action-item + b) + (push + action-item + new-action-table))) + (setq + action-table + (reverse + new-action-table)))) + (parser-generator--debug + (message + "'%s' takes precedence over '%s'" + b + a)) + ;; Skip rest of this iteration + (setq + skip-symbol + t))) + (let ((conflicted-item (gethash index-hash-key index-symbols))) - (if - (parser-generator-lr--symbol-takes-precedence-p - (car a) - (car b)) - (progn - (parser-generator--debug - (message - "'%s' takes precedence over '%s'" - a - b)) - ;; Remove b from added-actions - (let ((new-action-table)) - (dolist (action-item action-table) - (unless - (equal - action-item - b) - (push - action-item - new-action-table))) - (setq - action-table - (reverse - new-action-table)))) - (parser-generator--debug - (message - "'%s' takes precedence over '%s'" - b - a)) - ;; Skip rest of this iteration - (setq - skip-symbol - t)))) + (error + "Reduce/%S conflict for %S in state %S" + (car (cdr conflicted-item)) + u + goto-index + )))) (unless (or