【问题标题】:ANTLR4 : null parameter as a inputANTLR4:空参数作为输入
【发布时间】:2018-04-04 23:46:19
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

  • 顺便说一句,根元素“解析”的目的是什么?为什么不从块开始:'FUNCTION' LPAREN(原子)?逗号(原子)? LPAREN EOF
  • 写过其他语法。对于问题,我仅限于此。
  • 'FUNCTION' LPAREN(原子)?逗号(原子)? LPAREN -> 为什么它以 LPAREN 结尾?
  • 将其更改为 RPAREN

标签: java parsing antlr grammar antlr4


【解决方案1】:

尝试更改 NIL : '' | '空值';到零:'null'; 当你用'?'定义原子时它应该接受输入。我猜空字符串很混乱。

对于功能,我建议以这种形式使用语法来启用各种参数...

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

【讨论】:

  • 试过了。它适用于 FUNCTION(null,"B") & 可以检测第一个和第二个参数。但在这种情况下不是 FUNCTION(,"B")。这仅给出一个参数
  • 顺便说一句,它的解析正确。无法在 ANTLR 访问者中获取两个参数
  • FUNCTION' LPAREN(原子)?逗号(原子)? LPAREN 实际上是错误的。还是不想支持一个或零个参数函数?
  • 我不希望它是一两个参数。只有两个参数就可以了。我们可以像这样检查它:(原子)吗?如果它为空,则将 NIL 放在语法本身中。我试过这样:{$atom.text.equals(null)? $atom.text = NIL;} 虽然不工作
  • 在这种情况下,它很好,很公正,我会避免使用“?”在这种情况下,你知道参数必须在那里
【解决方案2】:

我不是专家。这是一种可能的解决方案:

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

【讨论】:

    猜你喜欢
    • 2018-04-03
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多