如何在抽象语法树之前编辑语法树?

问题描述 投票:0回答:1

我想了解如何有效地使用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, '']] 有什么关系?您应该如何解释此解析树的结构和嵌套?有没有一种方法可以用缩进和符号名而不是代码漂亮地打印出来?

python parsing grammar tokenize
1个回答
0
投票
您在标题中问了一个问题,在身体中问了一些其他问题。这个答案主要是解决体内的问题,因为我不确定您要寻找的是哪种AST之前的转换。

我怀疑您提出的问题的答案要复杂得多。例如,all those numbers模块也不保留格式或注释(尽管它确实标识了令牌的行/列号,如果需要,您可以从中导出非注释行的水平格式)。如果您要编写半彩色的查看器,则需要使用grammar模块。该模块不会解析,因此如果您还想要解析树,则必须使用parsetokenize,然后将令牌与parse返回的令牌流相关联。

这些数字都是什么,以及它们与语法有什么关系?

它们要么标识非终结符(语法生成),要么标识终结符(令牌)。这两个类别的数字范围不会重叠,因此不会造成混淆。

您应如何解释此解析树的结构和嵌套?

[它代表从根生产(asttokenize,取决于您调用的是eval_input还是file_input)开始的完整,未经编辑(就我所知)的语法树。终端节点以终端索引号开头,其后是令牌的文本表示形式,如果需要,则以位置信息开头。非终端节点以非终端索引号开头,后跟子节点。 (显然总是至少有一个子节点; Python语法没有可为空的非终结符。)

注意,在大多数Python语法树上,嵌套非常深入,因为语法有很多单位产生式。 parser.expr模块所做的部分工作是浓缩单位产品的链。

是否可以用缩进和符号名代替代码来漂亮地打印出来?

确定:

parser.suite

© www.soinside.com 2019 - 2024. All rights reserved.