问题描述
我正在尝试使用 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; } ;
使用上述语法正确解析以下字符串。
- 联合[Dict[str,str]]
- 字典[str,str]
- 列表[str]
但是,当我在 Union、Dict 或 Tuple 中有多个 Union、Dict 或 Tuple 时,它无法正确解析。例如 Union[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]]
之类的输入也将正确匹配。