克服antlr4的歧义?

时间:2015-11-29 18:15:37

标签: antlr4

我有下面的语法,它是我正在研究的东西的摘录,它突出了我无法克服的问题。

在我的语法中,表达式是文字,是数字或表达“+”另一个表达。所以我想解析:

'email' => 'unique:users,email,'. Auth::user()->id.'|email|max:255',

但是我对数字的定义意味着它可以有一个可选的符号,例如:

1 + 2 + 3 + 4 1+1

所以可以想象我可能需要解析:

-11 + +1

我发现1 + -1(或更大的数字)没问题。

我正在努力解析的是没有空格或有额外符号的输入,例如:

1 + 1

这会导致真正的问题,因为词法分析器选择1+2作为数字,而实际上我想要+2作为数字,2作为表达式中的符号被选中。< / p>

如何让antlr4识别出差异?

+

2 个答案:

答案 0 :(得分:0)

您可以在数字标记中删除可选的签名 lexem。这样,当您有关于输入上下文的更多信息时,您将推迟标记处理到解析器阶段。这里的想法是创建用于否定的一元运算符,减号( - )和加号(+)以保持数字完整。

grammar example;

example : expression* EOF;

expression
    : ('+'|'-') expression # unaryOp
    | expression ('+'|'-') expression # binaryOp
    | Number # number
    ;

Number : [0-9]+;
WS : [ \t\r\n\u000C]+ -> skip;

答案 1 :(得分:-1)

不确定它是否仍然相关,但这里有: 你的表达式规则似乎有问题,它无法匹配&#34; literal + literal&#34; string,因为它总是需要左边的表达式。

您的规则应该类似于:

expression:
literal + literal
| expression + literal;