gpt4 book ai didi

java - ANTLR 重写语句的问题(简单?)

转载 作者:行者123 更新时间:2023-12-01 15:08:30 25 4
gpt4 key购买 nike

我不断收到MissingTokenExceptionNullPointerException,如果我没记错的话NoViableAlterativeException。 ANTLRWorks 的日志文件/控制台输出对我来说没有足够的帮助。

我想要的是如下重写:

(expression | FLOAT) '(' -> (expression | FLOAT) '*('

下面是我抓出来用来创建测试文件的语法示例。

grammar Test;

expression
: //FLOAT '(' -> (FLOAT '*(')+
| add EOF!
;
term
:
| '(' add ')'
| FLOAT
| IMULT
;

IMULT
: (add ('(' add)*) -> (add ('*' add)*)
;
negation
: '-'* term
;

unary
: ('+' | '-')* negation
;

mult
: unary (('*' | '/') unary)*
;

add
: mult (('+' | '-') mult)*
;

ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;

FLOAT
: ('0'..'9')+ '.' ('0'..'9')*// EXPONENT?
| '.' ('0'..'9')+ //EXPONENT?
| ('0'..'9')+ //EXPONENT
;

WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;

我也尝试过:

imult
: FLOAT '(' -> FLOAT '*('
;

还有这个:

IMULT / imult
: expression '(' -> expression '*'
;

以及我已经记不清的无数其他版本(黑客)。

谁能帮我解决这个问题吗?

最佳答案

我以前也遇到过这个问题。基本答案是 ANTLR 不允许您在“->”语句的右侧使用左侧不存在的标记。但是,您可以做的是使用专门为 AST 定义的额外标记。只需在语法规则之前创建一个标记 block ,如下所示:

tokens { ABSTRACTTOKEN; }

您可以像这样在语法语句的右侧使用它们。

imult
: FLOAT '(' -> ^(ABSTRACTTOKEN FLOAT)
;

希望有帮助。

关于java - ANTLR 重写语句的问题(简单?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12639361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com