Function 使用ANTLR4创建没有参数的函数
我仍然是ANTLR4的新手,我正在努力实现以下目标 我有由逻辑操作组成的业务规则 (A='text'或B<1)和getDataDB 函数getDataDB不接受任何参数。函数将检索一些数据来验证它,并返回true或false 我的语法在下面Function 使用ANTLR4创建没有参数的函数,function,parsing,antlr4,business-rules,Function,Parsing,Antlr4,Business Rules,我仍然是ANTLR4的新手,我正在努力实现以下目标 我有由逻辑操作组成的业务规则 (A='text'或B
/*
* 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
;