克服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。你知道这个答案已经有一年多了,对吗?是的。这里的内容和时间有什么联系?