gpt4 book ai didi

python - 如何从 ParseResults 获取抽象语法树

转载 作者:行者123 更新时间:2023-11-28 17:32:10 25 4
gpt4 key购买 nike

我正在开发一个翻译器,用于将 PC 上的简单脚本翻译成一些字节码,以便在微 Controller 上执行它(字节码)。

我已经使用 lex 和 re2c 在 C++ 中开发了翻译器,但我正在考虑切换到 pyparsing。

为了将我的脚本语句转换为字节码中的几个操作,我需要获取该语句的抽象语法树。

即这个脚本:

X = 1 - 2;

应该翻译成二进制等价物:

register1 <- 1
register2 <- 2
register3 <- register1 - register2
x <- register3

我有这个 python 代码:

integer = Combine( number )
ident = Word(alphas,alphanums)

expr = Forward()
atom = ( integer |
( lpar + expr.suppress() + rpar )
)
expr << ( atom + (addop | multop) + atom )

statement = ident + assign + expr


L = statement..parseString( line )

有没有在L中访问AST的叶子的例子?或者类似的东西...

提前致谢

最佳答案

您当前的解析器只会给您一个已解析标记的简单列表,因为这是 pyparsing 中的默认设置。这样做的目的是,无论您如何构建解析器,无论是分成较小的部分然后将它们全部放在一起,还是只放在一个巨大的语句中,您从解析中获得的标记都是结构化的(或非结构化的)。要获得类似于 AST 的东西,您需要使用 pyparsing 的 Group 类定义您想要结构的位置(我也建议使用结果名称)。因此,例如,如果您将语句更改为:

statement = Group(ident("lhs") + '=' + Group(expr)("rhs"))

然后你的输出将更可预测 - 每个解析语句将有 3 个顶级元素 - 目标标识符(可寻址为 result.lhs),'=' 运算符和源表达式(可寻址为 result.rhs ).源表达式可能有更多的结构,但总的来说,在每个语句的最顶层总是有这 3 个。

为确保在评估 expr 时保留 RHS 表达式中的括号组,再次使用组:

atom = (integer | Group(lpar + expr + rpar))

您可以浏览解析结果的层次结构,就好像您在浏览嵌套列表的列表一样。

但我也鼓励您查看 SimpleBool example on the pyparsing wiki .在这个例子中,各种解析的表达式被渲染到类的实例中,然后可以使用访问者或迭代器对其进行处理,然后每个类都可以实现自己的特殊逻辑来发出你的字节码。想象一下,您已经编写了一个典型的解析器来生成 AST,然后遍历 AST 以创建 CodeGenerator 对象,这些对象子类化为 AssignmentCodeGenerator 或 IfCodeGenerator 或 PrintCodeGenerator 类,然后遍历该结构以创建您的字节码。相反,您可以在 pyparsing 中定义赋值、if-then-else 或 print 语句表达式,让 pyparsing 直接创建类,然后遍历类以创建字节码。最后,你的代码被整齐地组织成不同的语句类型,每种类型都封装了它应该输出的字节码类型。

关于python - 如何从 ParseResults 获取抽象语法树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33571800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com