[英]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 ;
但是無法正確構建樹。
Update1 :
這是樹:
0 null
-- 11 CONCAT
-- 4 (
-- 13 2,5
-- 5 )
和語法:
allFunction : FUNCTIONNAME LPAREN ARGUMENTS RPAREN;
Update2 :
語法:
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]
Update3 :
我一直在努力構建一個函數: 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;
在解析這樣的輸入時,您可以簡單地解析任何帶有任何參數(任何類型)未知次數的函數。 例如,它將解析CONCAT('a','b')
和IF(false,1,42)
。 但請注意,它也將解析IF(false,1,42,1,1,1,1,1,1,1,1,1,1)
。 因此,在解析完成后,您可以遍歷解析樹並驗證所有函數是否具有正確類型的適當數量的參數。
另外,有沒有辦法編輯解析樹?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.