克服antlr4中的歧义?
我有下面的语法,这是我正在研究的东西的摘录,它突出了一个我无法克服的问题 在我的语法中,表达式要么是一个数字,要么是一个表达式+另一个表达式。所以我想分析:克服antlr4中的歧义?,antlr4,Antlr4,我有下面的语法,这是我正在研究的东西的摘录,它突出了一个我无法克服的问题 在我的语法中,表达式要么是一个数字,要么是一个表达式+另一个表达式。所以我想分析: 1 + 2 + 3 + 4 等等 然而,我对数字的定义意味着它可以有一个可选符号,例如: 1、+1或-1 所以可以想象,我可能需要解析: 1 + 2 + 3 + 4 1++1或1+-1 我发现1+1或更大的数字是可以的 我正在努力解析没有空格或带有额外符号的输入,例如: 1+2 这会导致真正的问题,因为lexer选择+2作为数字,而实际
1 + 2 + 3 + 4
等等
然而,我对数字的定义意味着它可以有一个可选符号,例如:
1、+1或-1
所以可以想象,我可能需要解析:
1 + 2 + 3 + 4
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 : [ \t\r\n\u000C]+ -> skip;
不确定它是否仍然相关,但下面是: 您的表达式规则似乎有缺陷,它不能在literal+literal字符串上匹配,因为它总是希望在左侧有一个表达式 您的规则应该如下所示:
expression:
literal + literal
| expression + literal;
不确定它是否仍然相关,但下面是: 您的表达式规则似乎有缺陷,它不能在literal+literal字符串上匹配,因为它总是希望在左侧有一个表达式 您的规则应该如下所示:
expression:
literal + literal
| expression + literal;
您可以删除数字令牌中的可选符号lexem。这样,当您有更多关于输入上下文的信息时,您将把符号的处理推迟到解析器阶段。这里的想法是创建一元运算符来表示否定、减号-和加号+以保持数字的完整性
grammar example;
example : expression* EOF;
expression
: ('+'|'-') expression # unaryOp
| expression ('+'|'-') expression # binaryOp
| Number # number
;
Number : [0-9]+;
WS : [ \t\r\n\u000C]+ -> skip;
您可以删除数字令牌中的可选符号lexem。这样,当您有更多关于输入上下文的信息时,您将把符号的处理推迟到解析器阶段。这里的想法是创建一元运算符来表示否定、减号-和加号+以保持数字的完整性
grammar example;
example : expression* EOF;
expression
: ('+'|'-') expression # unaryOp
| expression ('+'|'-') expression # binaryOp
| Number # number
;
Number : [0-9]+;
WS : [ \t\r\n\u000C]+ -> skip;
它可以匹配literal+literal,因为表达式的子规则之一是literal。您知道这个答案已经有一年多了,对吗?是的。这里的内容和时间之间有什么联系?它可以匹配literal+literal,因为表达的子规则之一是literal。你知道这个答案已经有一年多了,对吗?是的。这里的内容和时间有什么联系?