我对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子句中,有没有一种方法可以将类名称放在可以放置实现的语法中
感谢您的帮助!
答案 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} })。