使用ANTLR4创建不带参数的函数

时间:2018-11-11 20:24:43

标签: function parsing antlr4 business-rules

我对ANTLR4还是陌生的,我正在努力实现以下目标

我有由逻辑运算组成的业务规则 (A ='文本'或B <1)和getDataDB

函数getDataDB不接受任何参数。该函数将检索一些数据以对其进行验证,然后返回true或false。

我的语法在下面

   /*
 * Test grammar
 */

grammar FunctionRule;

parse: expr EOF
    ; 


expr
 : expr binop expr                  #logicalExpression
 | lhs=VARIABLE compop rhs=VARIABLE #variableExpression
 | lhs=VARIABLE compop rhs=STRING   #stringExpression
 | lhs=VARIABLE compop rhs=NUMBER   #numberExpression
 | TRUE                             #booleanTrue
 | FALSE                            #booleanFalse
 | function                         #functionExpression
 | VARIABLE                         #booleanVariable
 | LEFTPAREN expr RIGHTPAREN        #enclosedExpression
 ;

binop : AND | OR
 ;

compop: EQUAL | LT | GT | LTE | GTE | NE
      ;

function  : ID {System.out.println("HELLLL");};



TRUE:       'true' | 'TRUE'  ;
FALSE:      'false' | 'FALSE';
STRING:     '"'   ~([\t\n\r]| '"')* '"'
     ;
ID : [getDataDB];
LEFTPAREN:  '(';
RIGHTPAREN: ')';
EQUAL     : '=' | 'EQ';
LT        : '<' | 'LT';
GT        : '>' | 'GT';
LTE       : '<=' | 'LE';
GTE       : '>=' | 'GE';
NE        : '!=' | 'NE';
AND       : 'AND' | '&' | 'and';
OR        : 'OR' | 'or' | '|';
VARIABLE  : [a-zA-Z]+[a-zA-Z0-9_.-]*;
NUMBER  : [0-9]+ ('.'[0-9]+)?;
SPACE     : [ \t\r\n] -> skip;

当我从语法生成类时,没有看到与该函数相关的任何内容。

1-如何在语法文件中正确定义一个函数。

2-在创建类之后,我可以在其中放置此函数的代码,仅在action子句中,有没有一种方法可以将类名称放在可以放置实现的语法中

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

ID : [getDataDB];

这意味着ID匹配单个字母,该字母可以是g,e,t,D,a或B之一。您可能想要的是ID: 'getDataDB';,它与字符串{{1 }}。请注意,称此getDataDB极易引起误解。

  

我可以在其中放置此功能的代码

您是否正在使用访客编写口译员?然后,如果函数名称等于ID,则将代码放入visitFunction方法中,或者放在从getDataDB调用的visitFunction方法中(现在情况总是如此,但我假设您最终想要引入多个功能。

或者,您也可以像这样稍微改变语法结构(删除ID规则):

getDataDB

然后您可以分别在function : 'getDataDB' # GetDataDB | 'otherFunction' # OtherFunction ; visitGetDataDB中定义函数。

所有这些都假设您希望函数名称为关键字(这意味着不能有用户定义的函数)。如果不这样做,则您不应该为函数名称使用单独的标记,因此零参数函数和变量在语法上变得难以区分(除非您添加了为函数添加visitOtherFunction的要求,但看起来不像是你想要什么)。因此,您应该只使用一个规则,该规则可以是变量或零参数函数,然后检查给定的标识符是否是()中的函数名(也许您只需要调用{{1} })。