我在构建能够解析 Python 3 的 AST 转储格式并将其转换为更易于使用的 AST 格式的语法时遇到问题。我决定为此编写一个 ANTLR 语法,但我在处理关键字块时遇到了问题(但出于某种原因,只有关键字块)。我把关键字语法隔离出来了,如图:
grammar kwds;
options {output=AST;}
keywords: 'keywords=['((', '?)keyword)*']' -> keyword*
;
keyword : 'keyword(arg='STRING', value='str')'
;
str : 'Str(s='STRING')' -> STRING
;
STRING
: '\'' ( ESC_SEQ | ~('\\'|'\'') )* '\''
;
fragment
ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| UNICODE_ESC
| OCTAL_ESC
;
EMPTYBRACKETS
: '[]';
fragment
OCTAL_ESC
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\\' ('0'..'7') ('0'..'7')
| '\\' ('0'..'7')
;
fragment
UNICODE_ESC
: '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
;
fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
这旨在接受关键字列表(0个或更多带有逗号分隔符),其格式显示在关键字规则中。
如果您为上述语法提供以下(有效)输入,
关键字=[关键字(arg='name', value=Str(s='UGA')), 关键字(arg='rank', value=Str(s='2'))]
语法会认识到这一点,因为它应该。
但是,使用我编写的“完整”python 3 AST 格式语法(可在http://pastebin.com/ETrSVXvf找到以节省空间,上述两条规则分别位于第 106 行和第 109 行),它使用几乎完全相同的语法规则,在从上面显示的示例中解析第一个关键字匹配后,令牌流似乎少了几个字符,在针对关键字规则进行解析时产生以下输出:
sample3.txt line 1:52 mismatched character 'e' expecting 'w'
sample3.txt line 1:53 no viable alternative at character 'y'
sample3.txt line 1:54 no viable alternative at character 'w'
sample3.txt line 1:55 no viable alternative at character 'o'
sample3.txt line 1:56 no viable alternative at character 'r'
sample3.txt line 1:57 no viable alternative at character 'd'
sample3.txt line 1:58 no viable alternative at character '('
sample3.txt line 1:59 missing ENDBR at 'arg='
我只能想到发生这种情况的一种可能性:由于语法中的歧义,某些东西被错误地标记,因为我用来检测多个关键字语句的模式适用于其他类型的语句。但是,我完全不知道语法中的歧义实际上在哪里。
此外,任何关于如何提高我的语法的一般改进技巧都将不胜感激!