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

Using ANTLR4 to create functions with no argument

我还是 ANTLR4 的新手,我正在努力实现以下目标

我有由逻辑操作组成的业务规则 (A= 'text' 或 B < 1)和 getDataDB

函数 getDataDB 不接受任何参数。该函数将检索一些数据来验证它,return 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;

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

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

2- 创建 classes 后我可以把这个函数的代码放在哪里,它只在动作子句中吗,有没有办法把 class 名字放在我可以在其中放置实现的语法

感谢您的帮助!

ID : [getDataDB];

这意味着 ID 匹配可以是 g、e、t、D、a 或 B 之一的单个字母。您可能想要的是 ID: 'getDataDB'; 匹配字符串 getDataDB。请注意,调用此 ID 具有高度误导性。

where i can put the code for this function

你在写一个使用访问者的解释器吗?然后,如果函数名称等于 getDataDB,则将代码放入 visitFunction 方法或从 visitFunction 调用的 getDataDB 方法中(现在情况总是如此,但我假设您最终想要引入多个功能)。

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

function : 'getDataDB' # GetDataDB
         | 'otherFunction' # OtherFunction
         ;

那么你可以分别在visitGetDataDBvisitOtherFunction中定义函数。

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