Parsing Union[Dict[str,str],Dict[str,str]] with antlr 3



我正在尝试为字符串做解析器,如"Union[Dict[str,str],Dict[str,str]]"antlr3。下面是用于生成解析器的解析器语法。

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. Dict (str, str)
  3. 列表(str)

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

谁能帮我指出语法上的错误?

你的规则:

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]]这样的输入也会正确匹配。

最新更新