diff --git a/lib/compiler/passes/report-left-recursion.js b/lib/compiler/passes/report-left-recursion.js index 02f5900..de5b849 100644 --- a/lib/compiler/passes/report-left-recursion.js +++ b/lib/compiler/passes/report-left-recursion.js @@ -37,8 +37,12 @@ function reportLeftRecursion(ast) { rule_ref: function(node) { if (arrays.contains(visitedRules, node.name)) { + visitedRules.push(node.name); + throw new GrammarError( - "Possible left recursion detected for rule \"" + node.name + "\".", + "Possible left recursion detected (" + + visitedRules.join(" -> ") + + ").", node.location ); } diff --git a/spec/unit/compiler/passes/report-left-recursion.spec.js b/spec/unit/compiler/passes/report-left-recursion.spec.js index 4a1e73f..c1905cc 100644 --- a/spec/unit/compiler/passes/report-left-recursion.spec.js +++ b/spec/unit/compiler/passes/report-left-recursion.spec.js @@ -8,7 +8,7 @@ describe("compiler pass |reportLeftRecursion|", function() { it("reports direct left recursion", function() { expect(pass).toReportError('start = start', { - message: 'Possible left recursion detected for rule \"start\".', + message: 'Possible left recursion detected (start -> start).', location: { start: { offset: 8, line: 1, column: 9 }, end: { offset: 13, line: 1, column: 14 } @@ -21,7 +21,7 @@ describe("compiler pass |reportLeftRecursion|", function() { 'start = stop', 'stop = start' ].join("\n"), { - message: 'Possible left recursion detected for rule \"start\".', + message: 'Possible left recursion detected (start -> stop -> start).', location: { start: { offset: 21, line: 2, column: 9 }, end: { offset: 26, line: 2, column: 14 }