【问题标题】:Parsing Union[Dict[str,str],Dict[str,str]] with antlr 3使用 antlr 3 解析 Union[Dict[str,str],Dict[str,str]]
【发布时间】:2021-04-24 11:22:29
【问题描述】:

我正在尝试使用 antlr3 为“Union[Dict[str,str],Dict[str,str]]”等字符串制作解析器。 下面是我用来生成解析器的解析器语法。

grammar PyType;

options {
  output=AST;
  ASTLabelType=CommonTree;
}

tokens {
    OPEN_SQ_BR = '[';
    CLOSE_SQ_BR = ']';
    LIST = 'List';
    SET = 'Set';
    UNION = 'Union';
    DICT = 'Dict';
    TUPLE = 'Tuple';
    COMMA = ',';
 /*   Nothing = 'nothing'; */
    OPTIONAL = 'Optional';
    HYPHEN = '-' ;
    UNDERSCORE = '_' ;
    DOT = '\.';
}


/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/
parse
    :  expr
    ;

list_element
    : OPEN_SQ_BR expr CLOSE_SQ_BR -> expr
    ;

union_element
    : OPEN_SQ_BR (expr COMMA)+ CLOSE_SQ_BR -> expr+;

list_expr
    : LIST^ list_element*;

set_expr
    : SET^ list_element*;

union_expr
    : UNION^ union_element;

dict_expr
    : DICT^ union_element;

tuple_expr
    : TUPLE^ union_element;

optional_expr
    : OPTIONAL^ union_element;


DIGIT  : '0'..'9' ;

LETTER : 'a'..'z' |'A'..'Z'|'0'..'9'|'_' ;

NUMBER : DIGIT+ ;

SimpleType : ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'.')*('a'..'z'|'A'..'Z'|'_'|'0'..'9')
           ;


expr : list_expr
    | set_expr
    | SimpleType
    | union_expr
    | dict_expr
    | tuple_expr
    | optional_expr;

/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;

使用上述语法可以正确解析以下字符串。

  1. 联合[Dict[str,str]]
  2. 字典[str,str]
  3. 列表[str]

但是,当我在 Union、Dict 或 Tuple 中有多个 Union、Dict 或 Tuple 时,它​​无法正确解析。例如 Union[Dict[str,str],Dict[str,str]] 解析不正确。

有人可以帮我找出语法中的错误吗?

【问题讨论】:

    标签: java parsing antlr grammar antlr3


    【解决方案1】:

    你的规则:

    union_element
        : OPEN_SQ_BR (expr COMMA)+ CLOSE_SQ_BR -> expr+
        ;
    

    不可能是正确的:它说expr 必须始终以, 结尾,导致它不匹配Union[Dict[str,str]](以及你提到的所有其他输入示例,据我所知)但匹配的东西改为Union[Dict[str,str,],]

    你应该这样做:

    union_element
        : OPEN_SQ_BR expr (COMMA expr)* CLOSE_SQ_BR -> expr+
        ;
    

    随着这一变化,我认为像Union[Dict[str,str],Dict[str,str]] 这样的输入也将被正确匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2011-09-05
      • 2020-10-17
      • 2022-10-12
      相关资源
      最近更新 更多