2017-10-24 1 views
0

Ich habe eine Funktion in ANTLR4 implementiert. Z.B. - FUNKTIONS ("A", "B")ANTLR4: Null-Parameter als Eingabe

Grammar:

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 : . ; 

Für Eingangsfunktion ("B"),

nicht in der Lage zwischen dem ersten und zweiten Parameter zu differenzieren.

"B" als ersten Parameter erhalten.

Vielen Dank für Hilfe.

+0

BTW, was ist der Zweck des Wurzelelements 'parse'? Warum nicht mit Block beginnen: 'FUNKTION' LPAREN (Atom)? COMMA (Atom)? LPAREN EOF – Divisadero

+0

Hatte andere Grammatik geschrieben. Für Frage habe ich mich nur darauf beschränkt. – Bond

+0

'FUNKTION' LPAREN (Atom)? COMMA (Atom)? LPAREN -> warum endet es mit LPAREN? – Divisadero

Antwort

0

Versuchen Sie, NIL zu ändern: '' | 'Null'; zu NIL: 'null'; Wenn Sie ein Atom mit '?' Es sollte die Eingabe übernehmen. Ich denke, leere Zeichenfolge ist verwirrend.

Für die Funktion I Grammatik in dieser Form würde vorschlagen, verschiedene Parameter ...

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

Versucht es. Es funktioniert für FUNCTION (null, "B") und kann ersten und zweiten Parameter erkennen. Aber nicht in diesem Fall FUNCTION (, "B"). Dies gibt nur einen Param – Bond

+0

By the way, seine Parsing korrekt. Kann nicht beide Parameter in ANTLR-Besucher erhalten – Bond

+0

FUNKTION 'LPAREN (Atom)? COMMA (Atom)? LPAREN ist eigentlich falsch. Oder möchten Sie NICHT eine oder keine Parameterfunktionen unterstützen? – Divisadero

0

Ich bin kein Experte zu ermöglichen. Hier eine mögliche Lösung:

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] ; 

Datei t.text:

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

Ausführung:

$ 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" 
... 

oder:

$ 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" 

Variable e1, e2, etc. sind in der definiert Regelkontext und im Zuhörer zugänglich.