当前位置: 首页 > 知识库问答 >
问题:

ANTLR4语法-字段和扩展表达式中带“点”的问题

盛琪
2023-03-14

我有以下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)
(FieldsV1)*(FieldsV2)+(Constants<missing ')'> 

除此之外还有一个问题:-

 (Var1)(Var2)    

对于上面的场景,ANTLR没有抛出错误,表达式不应该是(Var1)(Var2)--它应该总是包含操作符(Var1)*(Var2)或(Var1)+(Var2)等。解析器错误树没有生成此错误。如何修改语法以确保即使是这种情况也被考虑在内。

共有1个答案

东方弘壮
2023-03-14

若要识别ID类似于fields.v1,请将ID的Lexer规则更改为如下所示:

fragment ID_NODE: [a-zA-Z_][a-zA-Z0-9]*;
ID: ID_NODE ('.' ID_NODE)*;

注意,由于ID的每个“节点”都遵循相同的规则,所以我将其作为一个lexer片段,可以用来组成ID规则。我还在片段的第二部分添加了0-9,因为您似乎希望允许IDs中的数字

然后,ID规则使用该片段构建Lexer规则,该规则允许ID中的点。

处理两个示例的修订版:

grammar ExpressionGrammar;

parse: expr EOF;

expr:
    MIN expr
    | expr ( MUL | DIV) expr
    | expr ( ADD | MIN) expr
    | NUM
    | ID
    | function
    | '(' expr ')';

function: ID '(' arguments? ')';

arguments: expr ( ',' expr)*;

/* Tokens */

MUL: '*';
DIV: '/';
MIN: '-';
ADD: '+';
OPEN_PAR: '(';
CLOSE_PAR: ')';

NUM: '0' | [1-9][0-9]*;
fragment ID_NODE: [a-zA-Z_][a-zA-Z0-9]*;
ID: ID_NODE ('.' ID_NODE)*;
COMMENT: '//' ~[\r\n]* -> skip;
WS: [ \t\n]+ -> skip;

(现在我已经阅读了评论,这几乎只是应用评论中的建议)

 类似资料:
  • 问题内容: 我需要一个正则表达式 那么任何数字。并再次编号和。 所以这是有效的 但 无效 我尝试了以下模式: 但这些都不满足我的要求。请帮忙? 我现有的代码是 问题答案: 这样的事情应该起作用: 编辑 是的,不从该描述,如果最终清除被允许(假定一个初始是 不 )。 如果不: 或者 (如果看起来更合乎逻辑) 测试 产生:

  • 我在ANTLR4中有以下语法 一切都很好.我在语法1中哪里错了?

  • 我是ANTLR的新手,并使用ANTLR4(4.7.2 Jar文件)。我目前正在研究Oracle解析器。我对十进制数字有问题。我只保留了相关的部分。我的语法文件如下。 我该怎么做?我尝试过使用_input.la(-1)!='.'}?等,但对我来说并不正确。我尝试了提到的许多其他步骤(大多数解决方案适用于ANTLR3,但不适用于ANTLR4)。在lexer中有没有一种简单的方法可以做到这一点?我不想编

  • 表达式会通过parser生成抽象语法树。Native提供了解析引擎可以解析这个语法树,并计算出结果。 目前parser支持两大类功能: 基本四则运算、逻辑运算符、比较运算符 函数(如大部分的math函数、动画插值器函数、一些工具函数等) 下面是具体支持的情况: 运算符 + >= - <= * == - === () != % !== ** && > || < ! ?: Math函数 sin sqr