问题标签 [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 投票
6 回答
12489 浏览

java - 从抽象语法树获取控制流图

我有一个从 ANTLR Parser Generator for Java 派生的 AST。我想做的是以某种方式构建源代码的控制流图,其中每个语句或表达式都是一个唯一的节点。我知道这个识别肯定有一些递归性,我想知道你会建议什么作为最佳选择,如果 ANTLR 有一个我可以用于这项工作的工具集。干杯,克里斯


编辑 - 我主要关心的是从 AST 获取控制流图(CFG)。这样我可以获得源的树表示。澄清一下,源代码和实现语言都是 Java。

0 投票
2 回答
6115 浏览

java - javac.exe AST 编程访问示例

是否可以通过编程方式访问 javac.exe 中的抽象语法树(AST)?你能举个例子吗?

0 投票
2 回答
1193 浏览

java - Eclipse 抽象语法树编程访问

您能否提供一个以编程方式访问给定代码的 Eclipse 抽象语法树的示例?

例如获取 AST 用于:


Class1.java

}

0 投票
12 回答
13377 浏览

c# - 将 C# 代码翻译成 AST?

目前是否可以将 C# 代码转换为抽象语法树?

编辑:一些澄清;我不一定希望编译器为我生成 AST - 解析器会很好,尽管我想使用“官方”的东西。不幸的是,Lambda 表达式是不够的,因为它们不允许我使用我正在寻找的语句体。

0 投票
11 回答
27437 浏览

c - 来自 C 代码的 AST

我想对 C 源代码进行一些转换。我需要一个在 linux 上从源代码生成完整 AST 的工具,以便我可以在这个 AST 上应用我的转换,然后将其转换回 C 源代码。我尝试了ELSA,但它没有被编译。(我使用的是 Ubuntu 8.4)。谁能推荐一个更好的工具/应用程序?

0 投票
6 回答
1300 浏览

php - 在 PHP 中合并正则表达式

假设我有以下两个包含正则表达式的字符串。我如何合并它们?更具体地说,我希望将这两个表达式作为替代。

当然,将其作为字符串操作执行是不切实际的,因为它会涉及解析表达式、构造语法树、合并树,然后输出另一个与树等效的正则表达式。没有这最后一步,我很高兴。不幸的是,PHP 没有 RegExp 类(或者有吗?)。

什么办法可以做到这一点?顺便说一句,还有其他语言提供方法吗?这不是很正常的情况吗?可能不会。:-(

或者,有没有一种方法可以有效地检查两个表达式中的任何一个是否匹配,以及哪个更早匹配(如果它们在同一位置匹配,则哪个匹配更长)?这就是我目前正在做的事情。不幸的是,我经常在长字符串上这样做,用于两个以上的模式。结果很(是的,这绝对是瓶颈)。

编辑:

我应该更具体——对不起。$a并且$b变量,它们的内容不在我的控制范围内!否则,我只会手动合并它们。因此,我无法对使用的分隔符或正则表达式修饰符做出任何假设。请注意,例如,我的第一个表达式使用i修饰符(忽略大小写),而第二个表达式使用x(扩展语法)。因此,我不能只连接两者,因为第二个表达式不忽略大小写,第一个不使用扩展语法(并且其中的任何空格都很重要!

0 投票
4 回答
573 浏览

compiler-construction - 我的 AST 应该是什么样子才能轻松转换?

我有一种类似于 javascript 的最小玩具语言。我生成了一个 AST 来尝试一些优化技术,比如逃逸分析、类型推断。我尝试了一些方法,例如概括运算符标记而不是每个类/函数,在每个节点上保留类型信息......但我仍然不觉得我要去任何地方。工作很快就会变得笨拙......

我研究了 lua5、neko、v8,但是......好吧......我肯定不是周围最聪明的人之一。

有没有人有设计 AST 和在 AST 上实现转换的经验,这很容易处理?我会很感激让您的生活更轻松的提示和技巧?

(请不要叫我去看龙书,我已经有了。)

0 投票
3 回答
2023 浏览

parsing - 具体和抽象语法树的标准格式

我有一个爱好项目的想法,该项目执行一些代码分析和操作。该项目将需要给定源文件的具体和抽象语法树。此外,两棵树之间的双向引用会很有帮助。我想避免转录语法来构建我自己的词法分析器和解析器的工作。

是否有描述具体或抽象语法树的标准格式?是否有任何广泛使用的工具链支持输出到这些格式?

我没有考虑特定的目标编程语言。任何流行的原型都可以,但我更喜欢我熟悉的原型:Python、C#、Javascript 或 C/C++。

我希望能够通过工具或库运行源文件并取回两棵树。在理想情况下,在代码上运行该工具是可行的,因为它正在由用户编辑并且可以容忍错误。同样,我只是想开发一个原型,所以这些要求非常宽松。

谢谢!

0 投票
2 回答
499 浏览

groovy - 我可以在 Groovy 中使用 AST 转换来扩展其语法吗?

我已经看到了如何使用 Groovy AST 转换来扩展语言的示例,例如在方法调用之前和之后进行记录,如此处所示。但是,是否也可以使用这个框架来扩展语言本身的语法?例如,如果我希望能够将以下内容解析并转换为 AST,然后生成一组语句,该怎么办:

0 投票
2 回答
1247 浏览

groovy - 无法让 Groovy AST 示例工作

我正在尝试学习如何使用(和扩展)groovy,并且我正在按照此页面中的示例进行操作。基本上,它展示了如何为 groovy 代码定义一个注释,让您可以连接到编译器进程。该示例围绕将导致在方法调用之前和之后打印行的编写和注释。

我的代码如下;首先是必要的进口:

然后,我们定义要使用的注解:

然后是转换本身:

最后,我应该使用这种转换的代码:

现在,这应该打印Starting f\n hello from f \n Ending f,但它打印的只是hello from f(这就是我的问题)。正如您从代码中看到的那样,我还在转换本身中放置了一条访问 astnodes消息,希望看看它是否会到达那里,但可惜它没有(或者看起来如此)。

groovy -version印刷Groovy Version: 1.6.0 JVM: 1.6.0_11

任何人都可以尝试这段代码,看看它是否适用于他们的系统,或者给我一些关于可能出错的指示吗?