Function 使用ANTLR4创建没有参数的函数

Function 使用ANTLR4创建没有参数的函数,function,parsing,antlr4,business-rules,Function,Parsing,Antlr4,Business Rules,我仍然是ANTLR4的新手,我正在努力实现以下目标 我有由逻辑操作组成的业务规则 (A='text'或B

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

我有由逻辑操作组成的业务规则 (A='text'或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;
/*
*测试语法
*/
语法功能规则;
解析:expr-EOF
; 
expr
:expr binop expr#logicalExpression
|lhs=变量组合rhs=变量#变量表达式
|lhs=变量组合rhs=字符串#字符串表达式
|lhs=变量组合rhs=数字#数字表示
|真的#布尔真的
|假#布尔假
|函数#函数表达式
|变量#布尔变量
|LEFTPAREN表达式RIGHTPAREN#封闭表达式
;
比诺普:和|或
;
组合:相等| LT | GT | LTE | GTE | NE
;
函数:ID{System.out.println(“HELLLL”);};
真:“真”|“真”;
假:“假”|“假”;
字符串:''“~([\t\n\r]|'')*''
;
ID:[getDataDB];
左括号:'(';
右括号:')';
相等:“=”|“EQ”;
LT:|'GT';
LTE:“=”|“GE”;
NE:“!=”|“NE”;
和:'和'&'和';
或“或”|“或”|“或”|”;
变量:[a-zA-Z]+[a-zA-Z0-9.-]*;
编号:[0-9]+('.[0-9]+)?;
空格:[\t\r\n]->跳过;
当我从语法生成类时,我没有看到任何与函数相关的内容

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

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

谢谢你的帮助

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

我可以把这个函数的代码放在哪里

您是在使用访问者编写解释器吗?然后,如果函数名等于
getDataDB
(现在总是这样,但我假设您最终想要引入多个函数)

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

然后您可以分别在
visitGetDataDB
visitOtherFunction
中定义函数


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

亲爱的sepp2K,谢谢你的回答,我成功地添加了我的函数实现。
ID : [getDataDB];
function : 'getDataDB' # GetDataDB
         | 'otherFunction' # OtherFunction
         ;