antlr nongreedy运算符无法匹配有效输入

时间:2013-05-29 22:40:46

标签: antlr antlr4

antlr4中的以下规则不适用于有效输入:

testSimple
    : 'name' 'eq' WORD+?  .*? NEWLINE

WORD:  ~[ \t\f\r\n]+ ;

输入是:

name eq John Tom Allen notAName

错误是:

line 1:8 no viable alternative at input 'John'

我知道使用nongreedy运算符有一些限制,比如之后的'第一场比赛获胜'规则。规则特别含糊不清。但它至少应该至少在一种方式上与输入相匹配吗?

1 个答案:

答案 0 :(得分:1)

尝试使用输入规则末尾的显式EOF符号进行解析。例如:

startTestSimple
    :   testSimple EOF
    ;

如果没有明确的EOF,算法可能无法在某些情况下找到可行的替代方案。 Issue #118描述了一个问题;遗憾的是,已知解决方案的性能影响非常大,因此在我们提出替代解决方案之前,我们不会将其包含在ANTLR 4运行时中。