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