我有下面的语法,它是我正在研究的东西的摘录,它突出了我无法克服的问题。
在我的语法中,表达式是文字,是数字或表达“+”另一个表达。所以我想解析:
'email' => 'unique:users,email,'. Auth::user()->id.'|email|max:255',
等
但是我对数字的定义意味着它可以有一个可选的符号,例如:
1 + 2 + 3 + 4
,1
或+1
所以可以想象我可能需要解析:
-1
或1 + +1
我发现1 + -1
(或更大的数字)没问题。
我正在努力解析的是没有空格或有额外符号的输入,例如:
1 + 1
这会导致真正的问题,因为词法分析器选择1+2
作为数字,而实际上我想要+2
作为数字,2
作为表达式中的符号被选中。< / p>
如何让antlr4识别出差异?
+
答案 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;