我想了解如何有效地使用stdlib parser
模块,因为有时parser
丢失了太多信息(它吃掉了空格,注释,多余的括号等-与源代码格式化程序相关的详细信息,示例)
ast.parse
ast.parse
是什么?与>>> parser.expr('(*x,)').tolist()
[258,
[332,
[306,
[310,
[311,
[312,
[313,
[316,
[317,
[318,
[319,
[320,
[321,
[322,
[323,
[324,
[325,
[7, '('],
[326,
[315,
[16, '*'],
[316,
[317,
[318,
[319,
[320, [321, [322, [323, [324, [325, [1, 'x']]]]]]]]]]]],
[12, ',']],
[8, ')']]]]]]]]]]]]]]]]],
[4, ''],
[0, '']]
有什么关系?您应该如何解释此解析树的结构和嵌套?有没有一种方法可以用缩进和符号名而不是代码漂亮地打印出来?
我怀疑您提出的问题的答案要复杂得多。例如,all those numbers模块也不保留格式或注释(尽管它确实标识了令牌的行/列号,如果需要,您可以从中导出非注释行的水平格式)。如果您要编写半彩色的查看器,则需要使用grammar模块。该模块不会解析,因此如果您还想要解析树,则必须使用parse
或tokenize
,然后将令牌与parse
返回的令牌流相关联。
这些数字都是什么,以及它们与语法有什么关系?
它们要么标识非终结符(语法生成),要么标识终结符(令牌)。这两个类别的数字范围不会重叠,因此不会造成混淆。
您应如何解释此解析树的结构和嵌套?
[它代表从根生产(ast
或tokenize
,取决于您调用的是eval_input
还是file_input
)开始的完整,未经编辑(就我所知)的语法树。终端节点以终端索引号开头,其后是令牌的文本表示形式,如果需要,则以位置信息开头。非终端节点以非终端索引号开头,后跟子节点。 (显然总是至少有一个子节点; Python语法没有可为空的非终结符。)
注意,在大多数Python语法树上,嵌套非常深入,因为语法有很多单位产生式。 parser.expr
模块所做的部分工作是浓缩单位产品的链。
是否可以用缩进和符号名代替代码来漂亮地打印出来?
确定:
parser.suite