私は専門家ではありません。ここでは一つの可能な解決策:
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、などが定義されていますルールコンテキストリスナーでアクセス可能です。
btw、ルート要素 'parse'の目的は何ですか?なぜブロックで始まらないのですか? 'FUNCTION' LPAREN(原子)? COMMA(原子)? LPAREN EOF – Divisadero
他の文法が書かれていました。質問のために私はこれに限られています。 – Bond
'FUNCTION' LPAREN(原子)? COMMA(原子)? LPAREN - >なぜLPARENで終わるのですか? – Divisadero