- Notifications
You must be signed in to change notification settings - Fork131
Open
Description
I've isolated a 3-rule pattern, where I'd expect the parser to succeed for a given input, but it fails instead. The sample grammar:
RuleA ::= RuleB.RuleB ::= IDENTIFIER | RuleC '.' IDENTIFIER .RuleC ::= RuleB | RuleA .
The implementation:
importscala.util.parsing.combinator._importscala.util.parsing.combinator.syntactical.StandardTokenParsersobjectSimpleParserextendsStandardTokenParserswithPackratParsers { lexical.delimiters++=List(".","$")lazyvalruleA:PackratParser[String]= ruleB<~"$"lazyvalruleB:PackratParser[String]= (ident||| ruleC~>"."~> ident)lazyvalruleC:PackratParser[String]= (ruleB||| ruleA)defmain(args:Array[String])= { println(ruleA(newPackratReader(new lexical.Scanner("x.x$")))) }}
It fails for inputx.x$
, telling me that it expects a$
instead of the.
.
For me, this seems to be a problem with how indirect left-recursion is handled. I'm not sure if theoriginal algorithm is incapable of handling this pattern, or this is an implementation bug.
Edit:
I've accidentally used|
(first matching alt.) instead of|||
(longest matching alt.), I've fixed that in the code, but doesn't change the outcome.
Metadata
Metadata
Assignees
Labels
No labels