2017-10-24 11 views
0

私はANTLR4で関数を実装しました。例えば。 - FUNCTION( "A"、 "B")ANTLR4:nullパラメータを入力として

文法:入力機能( "B")について

parse 
    : block EOF 
     ; 

     block 
     : 'FUNCTION' LPAREN (atom)? COMMA (atom)? RPAREN 
     ; 

     atom 
     : NIL       #nilAtom 
     | list       #arrayAtom 
     | type=(INT | DOUBLE)   #numberAtom 
     | ID       #idAtom 
     ; 

     list 
     : BEGL array? ENDL 
     ; 

     array 
     : array_element (COMMA array_element)* # arrayValues 
     ; 


     array_element 
     : 
      atom # array_element_types 
     ; 

     COMMA : ','; 

     BEGL : '['; 
     LPAREN : '('; 

     RPAREN : ')'; 
     ENDL : ']'; 
     NIL : '' | 'null'; 
    INT : [0-9]+ ; 

    DOUBLE : [0-9]+ '.' [0-9]* | '.' [0-9]+ ; 

    COMMENT : '#' ~[\r\n]* -> skip ; 

    SPACE : [ \t\r\n] -> skip ; 

OTHER : . ; 

、第一及び第二のパラメータを区別する

できません。

最初のパラメータとして「B」を取得します。

ありがとうございました。

+0

btw、ルート要素 'parse'の目的は何ですか?なぜブロックで始まらないのですか? 'FUNCTION' LPAREN(原子)? COMMA(原子)? LPAREN EOF – Divisadero

+0

他の文法が​​書かれていました。質問のために私はこれに限られています。 – Bond

+0

'FUNCTION' LPAREN(原子)? COMMA(原子)? LPAREN - >なぜLPARENで終わるのですか? – Divisadero

答えて

0

NILを変更してみてください: '' | 'ヌル'; NILに: 'ヌル'; atomを '?'で定義すると、それは入力を取る必要があります。私は空の文字列が混乱していると思います。私は様々なパラメータを有効にするには、この形式で文法を示唆している機能については

...

function : FUNCNAME LPAR par? (PARDELIMITER par)* RPAR; 
+0

試してみました。 FUNCTION(null、 "B")&のための作業は、最初と2番目のパラメータを検出できます。しかし、この場合はFUNCTION(、 "B")ではありません。これはただ1つのパラメータを与えています – Bond

+0

ところで、その解析は正しく行われます。 ANTLR訪問者の両方のパラメータを取得できません – Bond

+0

FUNCTION 'LPAREN(atom)? COMMA(原子)? LPARENは実際には間違っています。または、1つまたはゼロのパラメータ関数をサポートしないことを望みますか? – Divisadero

0

私は専門家ではありません。ここでは一つの可能​​な解決策:

grammar Question; 

question 
@init {System.out.println("Question last update 1554");} 
    : (block NL)+ EOF 
    ; 

block 
    : 'FUNCTION' list 
    ; 

list 
@after {System.out.println("List " + $le.text); } 
    : LPAREN RPAREN 
    | LPAREN le=list_element RPAREN 
    ; 

list_element 
@after {System.out.println("List element e1=" + $e1.text + " e2=" + $e2.text + " e3=" + $e3.text); } 
    : e2=expr (COMMA e3=list_element)* 
    | e1=COMMA e3=list_element* 
    ; 

expr 
    : array     #exprArray 
    | atom     #exprAtom 
    | list     #exprList 
    ; 

array 
@after {System.out.println("Array a1=" + $a1.text + " a2=" + $a2.text); } 
    : LBRACKET RBRACKET 
    | LBRACKET a1=atom (COMMA a2=atom)* RBRACKET 
    ; 

atom 
    : ID      #idAtom 
    | type=(INT | DOUBLE)  #numberAtom 
    | STRING     #stringAtom 
// | NIL      #nilAtom 
    ; 

COMMA : ',' ; 
LPAREN : '(' ; 
RPAREN : ')' ; 
LBRACKET : '[' ; 
RBRACKET : ']' ; 
//NIL  : '' | 'null' ; // error(174): Question.g4:37:11: string literals and sets cannot be empty: '' 
ID  : LETTER (LETTER | DIGIT | '_')* ; 
STRING : '"' .*? '"' ; 
INT  : DIGIT+ ; 
DOUBLE : DIGIT+ '.' DIGIT* | '.' DIGIT+ ; 
COMMENT : '#' ~[\r\n]* -> skip ; 
NL  : [\r\n] ; 
WS  : [ \t] -> channel(HIDDEN) ; 
OTHER : . ; 

fragment DIGIT : [0-9] ; 
fragment LETTER : [a-zA-Z] ; 

ファイルt.text

FUNCTION("A","B") 
FUNCTION(,"B") 
FUNCTION("A", ["B", "C"]) 
FUNCTION() 
FUNCTION([]) 
FUNCTION([], "A") 
FUNCTION("A", ["B", "C"], ("D", "E")) 
FUNCTION("A", , "C") 

実行:

$ grun Question question -tokens -diagnostics t.text 
[@0,0:7='FUNCTION',<'FUNCTION'>,1:0] 
[@1,8:8='(',<'('>,1:8] 
[@2,9:11='"A"',<STRING>,1:9] 
[@3,12:12=',',<','>,1:12] 
[@4,13:15='"B"',<STRING>,1:13] 
[@5,16:16=')',<')'>,1:16] 
[@6,17:17='\n',<NL>,1:17] 
... 
@76,160:159='<EOF>',<EOF>,9:0] 
Question last update 1554 
line 1:13 reportAttemptingFullContext d=2 (list_element), input=',"B"' 
line 1:12 reportContextSensitivity d=2 (list_element), input=',' 
List element e1=null e2="B" e3=null 
List element e1=null e2="A" e3="B" 
List "A","B" 
... 

か:

$ grun Question question t.text 
Question last update 1554 
List element e1=null e2="B" e3=null 
List element e1=null e2="A" e3="B" 
List "A","B" 
List element e1=null e2="B" e3=null 
List element e1=, e2=null e3="B" 
List ,"B" 
... 
List "A", ["B", "C"], ("D", "E") 
... 
List "A", , "C" 

変数E1、E2、などが定義されていますルールコンテキストリスナーでアクセス可能です。

関連する問題