问题标签 [abstract-syntax-tree]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
443 浏览

java - 处理eclipse对java代码的解析?

eclipse 如何在内部构建其 java 代码的内部表示,以便能够检测诸如未引用的方法之类的东西,或者在项目中查找方法引用?是否有任何方法可以获取该信息以基于 eclipse 的内部解析构建工具,无论是作为 eclipse 插件还是作为独立的?(用于构建一些用于死代码检测的小工具)

我发现的最接近的事情是使用bcel构建我自己的表示,但这绝对是重新发明轮子的味道。

0 投票
9 回答
36626 浏览

parsing - 抽象语法树和具体语法树有什么区别?

我一直在阅读一些关于解释器/编译器如何工作的内容,而我感到困惑的一个领域是 AST 和 CST 之间的区别。我的理解是解析器生成一个 CST,将其交给语义分析器,语义分析器将其转换为 AST。但是,我的理解是语义分析器只是确保遵循规则。我真的不明白为什么它实际上会进行任何更改以使其抽象而不是具体。

关于语义分析器,我是否缺少某些东西,或者 AST 和 CST 之间的区别是否有些人为?

0 投票
3 回答
3197 浏览

java - 使用访问者模式的树转换

(免责声明:这些示例是在构建编译器的上下文中给出的,但是这个问题都是关于访问者模式的,不需要任何编译器理论知识。)我正在阅读 Andrew Appel 的 Java 中的现代编译器实现来尝试自学编译器理论(所以不,这不是家庭作业),我无法理解他想如何使用访问者模式将 AST 转换为 IR 树。(注意:我在 Python 中执行此操作,因此我也可以学习 Python,这就是为什么即将出现的示例不在 Java 中的原因。)据我了解,访问者模式中的访问和接受方法在设计上是 void 类型的,所以如果我有类似的东西

那么我希望能够编写一个访问者方法,例如

这会将两个子表达式转换为 IR,然后将它们与表示加号表达式的 BINOP 链接起来。当然,除非我修改所有接受函数以返回额外信息,否则这是不可能的,这也很麻烦,因为有时您只需要一个不返回任何内容的打印访问者。然而,本文坚持访问者是正确的方法,在 Java 中,这意味着它可以在没有 Python 的灵活性的情况下完成。我想不出任何不是令人难以置信的hacky的解决方案 - 任何人都可以告诉我预期的设计吗?

0 投票
4 回答
5416 浏览

python - 用于在 Python 中编程抽象语法树的库

我正在创建一棵树来表示一种简单的语言。我对抽象语法树非常熟悉,并且一直致力于在 C++ 中构建和使用它们的框架。是否有用于指定或操作任意 AST 的标准 python 库?如果做不到这一点,是否有一个对相同目的有用的树库?

注意,我不是在操作Python ASTs,所以我认为 AST 模块不合适。

0 投票
1 回答
2292 浏览

parsing - 如何让 ANTLR 输出分层 AST?

我有一个Lua 语法,(为了将其输出到 C# 进行了细微的修改,只是命名空间指令和几个选项更改),当我在一些示例输入上运行它时,它给了我一个带有根“nil”节点的树并且作为孩子,看起来是输入代码的标记化版本。看起来ANTLR的树语法在分层树而不是“平面”树上运行,所以我认为我不能按原样使用输出。

语法是否有一个简单的修复方法,还是需要从头开始重写?

0 投票
3 回答
804 浏览

c - 抽象语法树问题

我目前正在研究 C 下的编译器,我在为 AST 构造数据结构的部分迷失了方向,特别是对于我们为 ID 构造结构的部分,它被称为“符号表条目”

我看到网上的结构,例如:

它看起来像一个链表,因为它包含一个指向上一个条目 (*prev) 的指针,但这背后的逻辑是什么?

0 投票
1 回答
2196 浏览

scala - 我可以从实时 scala 代码中获取 AST 吗?

我说“实时代码”是因为我的意思不是来自文本源文件或源字符串,而是来自 partialFunctions / lambdas。(我知道Ruby1.8的parseTree和C# linq可以做到)

考虑一个偏函数 f:

我希望有一些工具可以像这样工作:

我不在乎语义的东西(上下文解析和隐式太复杂,对我来说没有必要),我只需要来自实时代码的语法树,有可能吗?

检查其他人的代码可能会出现问题,但我自己的代码呢?以下事情可能吗?

似乎需要对编译器进行一些黑客攻击,嗯...

0 投票
3 回答
4540 浏览

erlang - 如何将具有有效 Erlang 表达式的字符串转换为抽象语法树 (AST)?

我想将包含有效 Erlang 表达式的字符串转换为其抽象语法树表示,但到目前为止没有任何成功。

下面是我想做的一个例子。编译后,allingz:z().生成模块zed,通过调用zed:zed().返回在lists:reverse给定列表上应用的结果。

String可以是"[1,2,3].", 或"begin A=4, B=2+3, [A,B] end.", 或任何类似的东西。

(请注意,这只是我想做的一个例子,所以评估String不是我的选择。)


编辑

如下指定 ListAST 会生成一个巨大的 dict-digraph-error-monster,并显示“lint_module 中的内部错误”。


编辑2

此解决方案适用于简单的术语:

0 投票
6 回答
4532 浏览

f# - F# 解析抽象语法树

使用 F# 解析 AST 以构建解释器的最佳方法是什么?有很多用于琐碎语法(基本算术运算)的 F# 示例,但我似乎无法找到具有更大范围功能的语言的任何内容。

有区别的工会看起来非常有用,但是您将如何构建一个具有大量选项的工会?在别处定义类型(例如加法、减法、条件、控制流)并将它们作为预定义类型放在联合中是否更好?

还是我错过了一些更有效的编写口译员的方法?每种类型都有一个 eval 函数更有效,还是使用 monad?

提前致谢

0 投票
1 回答
932 浏览

php - (语法树)使用当前自上而下的路径自下而上递归迭代树

我有一个需要迭代的抽象语法树。AST 由柠檬移植到 PHP生成。

现在“通常”,我会使用全新的闪亮 (PHP 5.3.1) SPL 类,它看起来像这样:

实际上,这就是我已经在代码的另一部分中所做的,它确定了整个树的粗略类型(即它可以是赋值、条件等)。现在抛开细节不谈,唯一重要的是迭代是做RecursiveIteratorIterator::SELF_FIRST,也就是自顶向下。

回到我的问题,我需要自下而上地迭代 AST,即类似 RecursiveIteratorIterator::CHILD_FIRST 的东西,以便在树中进行一些替换和优化。

问题是,这些操作需要是上下文感知的,即我需要到当前节点的路径。而且由于我想自下而上迭代,所以我不能使用 RecursiveIteratorIterator。

好好想一想。我想自下而上迭代并在每次迭代时拥有当前节点的自上而下上下文(堆栈)。从技术上讲,它应该是可能的,因为 RecursiveIteratorIterator 必须首先到达树的尾部,才能向后迭代。在到达尾部的过程中,它可以缓存当前位置,并在从递归返回时简单地弹出元素。

现在这是一个关键字:缓存。这就是为什么我怀疑另一个 SPL 类应该是可能的:RecursiveCachingIterator。

问题是:真的有可能吗?如果是,如何?

我一直试图用一些代码来解决问题,但没有成功,而且文档很少。真的,真的很稀缺。

谁使用 SPL 找到了最优雅的解决方案,脱帽致敬!你是 PH​​P 大师!

PS:如果不清楚,我正在寻找尽可能多的 SPL(重新)使用。我知道我可以使用自定义堆栈编写自己的递归函数,无需提醒我。