Fix left recursion detection in sequences

Report left recursion also in cases where the recursive rule invocation
is not a direct element of a sequence, but is wrapped inside an
expression.

Fixes #359.
redux
David Majda 9 years ago
parent 9eb62051be
commit ad27a300a8

@ -29,9 +29,7 @@ function reportLeftRecursion(ast) {
sequence: function(node) {
arrays.every(node.elements, function(element) {
if (element.type === "rule_ref") {
check(element);
}
check(element);
return !asts.alwaysAdvancesOnSuccess(ast, element);
});

@ -39,6 +39,11 @@ describe("compiler pass |reportLeftRecursion|", function() {
expect(pass).not.toReportError('start = "" "" "a" start');
});
/* Regression test for #359. */
it("reports left recursion when rule reference is wrapped in an expression", function() {
expect(pass).toReportError('start = "" start?');
});
it("computes expressions that always advance on success correctly", function() {
expect(pass).toReportError([
'start = a start',

Loading…
Cancel
Save