AntLR4:构建一个函数

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 包括第一个参数。

语法:

这是链接:https : //ufile.io/undqshttps://files.fm/u/7c44aaee

Bar*_*ers 5

您不应创建词法分析器规则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). 因此,在解析完成后,您可以遍历解析树并验证所有函数是否具有正确类型的适量参数。

另外,有没有办法编辑解析树?

请参阅:如何手动重写 Antlr4 解析树?