我正在尝试为字符串做解析器,如"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; } ;
以下字符串使用上述语法正确解析。
- 联盟[Dict [str, str]]
- Dict (str, str)
- 列表(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]]
这样的输入也会正确匹配。