我在ANTLR4中实现了一个功能。例如。 - 功能(“A”,“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 : . ;
输入FUNCTION(,“B”),
无法区分第一个和第二个参数。
将“B”作为第一个参数。
感谢您的帮助。
答案 0 :(得分:0)
尝试更改NIL:''| '空值';到NIL:'null'; 当你用'?'定义atom时它应该采取输入。我猜空字符串很混乱。
对于函数,我建议使用这种形式的语法来启用各种参数......
function : FUNCNAME LPAR par? (PARDELIMITER par)* RPAR;
答案 1 :(得分: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等在规则上下文中定义,并且可以在侦听器中访问。