Viv*_*vek 3 java antlr function context-free-grammar antlr4
我一直在尝试构建一个函数: 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 ;
Run Code Online (Sandbox Code Playgroud)
但无法正确构建一棵树。
更新1:
这是树:
0 null
-- 11 CONCAT
-- 4 (
-- 13 2,5
-- 5 )
Run Code Online (Sandbox Code Playgroud)
和语法:
allFunction : FUNCTIONNAME LPAREN ARGUMENTS RPAREN;
Run Code Online (Sandbox Code Playgroud)
更新2:
语法:
allfunction : COMMA | FUNCTIONNAME LPAREN ARGUMENTS (COMMA ARGUMENTS)* RPAREN ;
Run Code Online (Sandbox Code Playgroud)
解析输出:
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]
Run Code Online (Sandbox Code Playgroud)
更新3:
我一直在尝试构建一个函数:-(
CONCAT(TEXT,TEXT)输入限制为 2 个参数)。这工作正常。我已经实现了 IF 函数:IF(TEXT,TEXT,TEXT)- 这也很好用。
问题是,我必须将其修改为:IF(BOOLEAN,INT,INT)- 但是对于 IF 中任何参数的现有语法,它可以接受 UNSIGNED_INT 包括第一个参数。
语法:
您不应创建词法分析器规则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;
Run Code Online (Sandbox Code Playgroud)
像这样解析您的输入时,您可以简单地解析任何接受任何参数(任何类型)未知次数的函数。例如,它将同时解析CONCAT('a','b')和IF(false,1,42)。但请注意,它也会解析IF(false,1,42,1,1,1,1,1,1,1,1,1,1). 因此,在解析完成后,您可以遍历解析树并验证所有函数是否具有正确类型的适量参数。
另外,有没有办法编辑解析树?