我有下面的语法,这是我正在做的事情的摘录,它突出了我无法克服的问题。
在我的语法中,一个表达式要么是一个数字,要么是另一个表达式"+"。所以我想解析:
1 + 2 + 3 + 4
等等。
然而,我对数字的定义意味着它可以有一个可选的符号,例如:
1
、+1
或-1
所以可以想象,我可能需要解析:
1 + +1
或1 + -1
我发现1 + 1
(或更大的数字)是好的。
我很难解析的是没有空格或带有额外符号的输入,例如:
1+2
这导致了实际的问题,因为lexer选择+2
作为数字,而实际上我希望2
作为数字,+
作为表达式中的符号。
如何让antlr4认识到差异?
grammar example;
example : expression* EOF;
expression
: expression '+' expression
| literal
;
literal : Number;
Number : Sign? Digits;
Sign : [-+];
Digits : Digit+;
Digit : [0-9];
WS : [ trnu000C]+ -> skip;
您可以删除Number令牌中的可选Signlexem。这样,当您有更多关于输入上下文的信息时,您将把符号处理推迟到解析器阶段。这里的想法是为求反创建一元运算符,为保持数字完整创建减号(-)和加号(+)。
grammar example;
example : expression* EOF;
expression
: ('+'|'-') expression # unaryOp
| expression ('+'|'-') expression # binaryOp
| Number # number
;
Number : [0-9]+;
WS : [ trnu000C]+ -> skip;
不确定它是否仍然相关,但如下所示:您的表达式规则似乎有错误,它不能在"literal+literal"字符串上匹配,因为它总是期望表达式在左边。
你的规则应该看起来像:
expression:
literal + literal
| expression + literal;