AntLR4:构建一个函数
AntLR4 : Build A function
我一直在尝试构建一个函数:concat('A','B') OR concat('A',9)
这是我写的示例语法:
LPAREN : '(' ;
RPAREN : ')' ;
FUNCTIONNAME : 'CONCAT' ;
ARGUMENTS : TEXT (',' TEXT)* ;
TEXT : ('a'..'z' | '0'..'9' | 'A'..'Z')+;
allFunction : FUNCTIONNAME LPAREN ARGUMENTS (',' ARGUMENTS)* RPAREN ;
但无法正确构建树。
更新 1:
这是树:
0 null
-- 11 CONCAT
-- 4 (
-- 13 2,5
-- 5 )
和语法:
allFunction : FUNCTIONNAME LPAREN ARGUMENTS RPAREN;
更新2 :
语法:
allfunction : COMMA | FUNCTIONNAME LPAREN ARGUMENTS (COMMA ARGUMENTS)* RPAREN ;
解析输出:
CONCAT(A,B,C)
[@0,0:5='CONCAT',<8>,1:0]
[@1,6:6='(',<1>,1:6]
[@2,7:11='A,B,C',<9>,1:7]
[@3,12:12=')',<2>,1:12]
[@4,13:14='\n\n',<7>,1:13]
[@5,15:14='<EOF>',<-1>,3:0]
更新3 :
我一直在尝试构建一个函数:
CONCAT(TEXT,TEXT)
-(输入限制为 2 个参数)。这很好用。
我已经实现了 IF 函数:IF(TEXT,TEXT,TEXT)
- 这也可以正常工作。
问题是,
我必须将其修改为: IF(BOOLEAN,INT,INT)
- 但是对于 IF 中任何参数的现有语法,它可以接受 UNSIGNED_INT 包括第一个参数。
语法:
这是 link:
https://ufile.io/undqs or https://files.fm/u/7c44aaee
您不应创建词法分析器规则 ARGUMENTS
。这是解析应该处理的事情。并且参数可能不应该是 TEXT
标记,而是某种表达式,这样 CONCAT(CONCAT(A, B), C)
也可以工作。
这样的事情将是一个好的开始:
grammar T;
parse
: expression EOF
;
expression
: expression 'AND' expression
| expression 'OR' expression
| function
| bool
| TEXT
| NUMBER
| TEXT
| ID
;
function
: ID '(' arguments? ')'
;
arguments
: expression ( ',' expression )*
;
bool
: TRUE
| FALSE
;
TRUE : 'true';
FALSE : 'false';
NUMBER : ( [0-9]* '.' )? [0-9]+;
ID : [a-zA-Z_] [a-zA-Z0-9_]*;
TEXT : '\'' ~[\r\n']* '\'';
SPACE : [ \t\r\n]+ -> skip;
当像这样解析您的输入时,您可以简单地解析任何接受任何参数(任何类型)未知次数的函数。例如。它将解析 CONCAT('a','b')
和 IF(false,1,42)
。但请注意,它还会解析 IF(false,1,42,1,1,1,1,1,1,1,1,1,1)
。因此,在解析完成后,您可以遍历解析树并验证所有函数是否具有正确类型的适当数量的参数。
Also, Is there any way to edit parse tree?
参见:How to rewrite Antlr4 Parse Tree manually?
我一直在尝试构建一个函数:concat('A','B') OR concat('A',9)
这是我写的示例语法:
LPAREN : '(' ;
RPAREN : ')' ;
FUNCTIONNAME : 'CONCAT' ;
ARGUMENTS : TEXT (',' TEXT)* ;
TEXT : ('a'..'z' | '0'..'9' | 'A'..'Z')+;
allFunction : FUNCTIONNAME LPAREN ARGUMENTS (',' ARGUMENTS)* RPAREN ;
但无法正确构建树。
更新 1:
这是树:
0 null
-- 11 CONCAT
-- 4 (
-- 13 2,5
-- 5 )
和语法:
allFunction : FUNCTIONNAME LPAREN ARGUMENTS RPAREN;
更新2 :
语法:
allfunction : COMMA | FUNCTIONNAME LPAREN ARGUMENTS (COMMA ARGUMENTS)* RPAREN ;
解析输出:
CONCAT(A,B,C)
[@0,0:5='CONCAT',<8>,1:0]
[@1,6:6='(',<1>,1:6]
[@2,7:11='A,B,C',<9>,1:7]
[@3,12:12=')',<2>,1:12]
[@4,13:14='\n\n',<7>,1:13]
[@5,15:14='<EOF>',<-1>,3:0]
更新3 :
我一直在尝试构建一个函数:
CONCAT(TEXT,TEXT)
-(输入限制为 2 个参数)。这很好用。
我已经实现了 IF 函数:IF(TEXT,TEXT,TEXT)
- 这也可以正常工作。
问题是,
我必须将其修改为: IF(BOOLEAN,INT,INT)
- 但是对于 IF 中任何参数的现有语法,它可以接受 UNSIGNED_INT 包括第一个参数。
语法:
这是 link: https://ufile.io/undqs or https://files.fm/u/7c44aaee
您不应创建词法分析器规则 ARGUMENTS
。这是解析应该处理的事情。并且参数可能不应该是 TEXT
标记,而是某种表达式,这样 CONCAT(CONCAT(A, B), C)
也可以工作。
这样的事情将是一个好的开始:
grammar T;
parse
: expression EOF
;
expression
: expression 'AND' expression
| expression 'OR' expression
| function
| bool
| TEXT
| NUMBER
| TEXT
| ID
;
function
: ID '(' arguments? ')'
;
arguments
: expression ( ',' expression )*
;
bool
: TRUE
| FALSE
;
TRUE : 'true';
FALSE : 'false';
NUMBER : ( [0-9]* '.' )? [0-9]+;
ID : [a-zA-Z_] [a-zA-Z0-9_]*;
TEXT : '\'' ~[\r\n']* '\'';
SPACE : [ \t\r\n]+ -> skip;
当像这样解析您的输入时,您可以简单地解析任何接受任何参数(任何类型)未知次数的函数。例如。它将解析 CONCAT('a','b')
和 IF(false,1,42)
。但请注意,它还会解析 IF(false,1,42,1,1,1,1,1,1,1,1,1,1)
。因此,在解析完成后,您可以遍历解析树并验证所有函数是否具有正确类型的适当数量的参数。
Also, Is there any way to edit parse tree?
参见:How to rewrite Antlr4 Parse Tree manually?