【发布时间】:2021-02-02 07:39:00
【问题描述】:
我有以下 ANTLR4 语法
grammar ExpressionGrammar;
parse: (expr)
;
expr: MIN expr
| expr ( MUL | DIV ) expr
| expr ( ADD | MIN ) expr
| NUM
| function
| '(' expr ')'
;
function : ID '(' arguments? ')';
arguments: expr ( ',' expr)*;
/* Tokens */
MUL : '*';
DIV : '/';
MIN : '-';
ADD : '+';
OPEN_PAR : '(' ;
CLOSE_PAR : ')' ;
NUM : '0' | [1-9][0-9]*;
ID : [a-zA-Z_] [a-zA-Z]*;
COMMENT: '//' ~[\r\n]* -> skip;
WS: [ \t\n]+ -> skip;
我有一个这样的输入表达式:-
(Fields.V1)*(Fields.V2) + (Constants.Value1)*(Constants.Value2)
ANTLR 解析器从上面的语法生成以下文本:-
(FieldsV1)*(FieldsV2)+(Constants<missing ')'>
如您所见,文本中缺少 Fields.V1 和 Fields.V2 中的“点”,并且还有一个 在此之上的一个问题:- 对于上述情况,ANTLR 不会向我抛出错误,表达式不应该是 (Var1)(Var2) - 它应该总是有运算符 (var1)*(var2) 或 (var1)+(var2) 等。解析器错误树不会生成此错误。应如何修改语法以确保考虑到这种情况。 (Var1)(Var2)
【问题讨论】:
-
首先将
EOF添加到您的parse规则中(并删除不必要的括号)。 -
我不确定您期望发生什么:我在您的词法分析器中没有看到任何与
.匹配的规则... -
@BartKiers 没错。我想知道我应该在哪里添加该匹配。因为我的解析器实际上不应该拆分“点”。整体应该是“Fields.V1”
-
@MikeLischke EOF - 你指的是第一个解析: (expr) 吗?你想让我把它改成 expr EOF 吗?
-
"它应该是一个整体 "Fields.V1"" 然后您应该编辑您的
ID规则,使其也包含.。但我很困惑:这是你自己的语法,还是你在某个地方找到的?我的印象是你在没有真正了解 ANTLR 的情况下盲目地尝试事情。也许退后一步,从基本的 ANTLR 教程开始?