克服antlr4中的歧义



我有下面的语法,这是我正在做的事情的摘录,它突出了我无法克服的问题。

在我的语法中,一个表达式要么是一个数字,要么是另一个表达式"+"。所以我想解析:

1 + 2 + 3 + 4

等等。

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

1+1-1

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

1 + +11 + -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;

相关内容

  • 没有找到相关文章

最新更新