2017-09-19 5 views
1

をビルドします。AntLR4:私は機能を構築しようとしてきた機能

LPAREN : '(' ; 
    RPAREN : ')' ; 
    FUNCTIONNAME : 'CONCAT' ; 
    ARGUMENTS : TEXT (',' TEXT)* ; 
    TEXT : ('a'..'z' | '0'..'9' | 'A'..'Z')+; 
    allFunction : FUNCTIONNAME LPAREN ARGUMENTS (',' ARGUMENTS)* RPAREN ; 

ではなく、適切にツリーを構築することができ:concat('A','B') OR concat('A',9)

は、ここで私が書いたサンプル文法です。

アップデート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] 

Update3と

Iは、関数を構築するトリングされている: CONCAT(TEXT,TEXT) - (入力は2つのパラメータに制限されています)。これは正常に動作します。 IF関数を実装しました:IF(TEXT,TEXT,TEXT) - これも正常に動作します。しかし、IFでの任意のパラメータのための既存の文法と、それは最初のパラメータを含むUNSIGNED_INTを受け入れることができます - IF(BOOLEAN,INT,INT)

問題は、私はそれを変更する必要があり、 です。

文法

ここでは、リンクです: https://ufile.io/undqshttps://files.fm/u/7c44aaee

+1

あなたが解析したい入力の例を教えてください。 "できない"はあまり役に立たない。どのエラーがありますか?どのようなトークンが 'grun allFunction -tokens -diagnostics 'で生成されますか? – BernardK

+0

@BernardK Concatをルート要素として設定できません。また、2,5は異なるノードでなければなりません。 – Bond

+0

あなたはARGUMENTSと同じ問題をSTRUCTURE_SELECTORと[link](https://stackoverflow.com/questions/46256834/how-to-make-antlr4-fully-tokenize-terminal-nodes/46258041#46258041)に記載しています。そしてまた、入力ファイルは何ですか、ツリーは入力ですか、作成する出力ですか? – BernardK

答えて

1

あなたはレクサールール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)を解析することに注意してください。したがって、解析が終了したら、解析木を歩き、すべての関数が正しいタイプの適切な量のパラメータを持っていることを検証できます。

また、構文解析ツリーを編集する方法はありますか?

参照してください:How to rewrite Antlr4 Parse Tree manually?

+0

返信用のThanx。私はこの文法を構築しようとすると、私はこのエラーが発生します:エラー(210):次のルールセットは相互に左回帰的です[式] – Bond

+0

はい、それを探しました: 'error(210)'はバージョン3 ANTLRのそのバージョンは、私が投稿した文法では動作しません。代わりにバージョン4を使用してください。 –

+0

これは正しい@Bartです。別のシナリオを考えてみましょう。関数の入力を2つのパラメータに限定する必要がある場合はどうなりますか? – Bond

関連する問題