ANTLR4:null参数作为输入

时间:2017-10-24 08:54:08

标签: java parsing antlr grammar antlr4

我在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”作为第一个参数。

感谢您的帮助。

2 个答案:

答案 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等在规则上下文中定义,并且可以在侦听器中访问。