在Eclipse中给出以下代码:
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
public class Question {
public static void main(String[] args) {
String source = "class Bob {}";
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(source.toCharArray());
CompilationUnit result = (CompilationUnit) parser.createAST(null);
String source2 = "class Bob {public void MyMethod(){}}";
ASTParser parser2 = ASTParser.newParser(AST.JLS3);
parser2.setSource(source2.toCharArray());
CompilationUnit result2 = (CompilationUnit) parser2.createAST(null);
}
}
Run Code Online (Sandbox Code Playgroud)
您如何使用Eclipse Compare API(org.eclipse.compare)来查找AST差异?(这可以在插件之外完成吗?)
我正在查看以下API
http://kickjava.com/src/org/eclipse/compare/structuremergeviewer/Differencer.java.htm http://kickjava.com/src/org/eclipse/jdt/internal/ui/compare/JavaStructureCreator.java.htm http://kickjava.com/src/org/eclipse/compare/CompareUI.java.htm
任何人都可以指向示例代码(或API - 但代码是首选).
我已经使用java编译器树api为java源文件生成ast.但是,我无法访问源文件中的注释.
到目前为止,我一直无法找到从源文件中提取注释的方法..有没有办法使用编译器api或其他工具?
我正在尝试按照这篇文章尝试 eclipse jdt/ast 。
这是作为输入的java代码:
class Hello
{
int hello()
{
int a = 0, b = 3;
/* hello */
{
b = a * 3;
}
return a;
}
public static void main(String[] args)
{
int z = 0, i = 3;
/* hello */
{
i = z * 3;
}
}
}
Run Code Online (Sandbox Code Playgroud)
用ASTView,显示VariableDeclarationFragment有对应的绑定。

然而,在这个访问者代码中VariableDeclarationFragment node,我总是得到 4 个局部变量 (a,b,z,i) 的空值作为resolveBinding()返回值。
这有什么问题?我使用日食靛蓝。

这是获取 AST 的代码
private static CompilationUnit createCompilationUnit(String sourceFile) …Run Code Online (Sandbox Code Playgroud) 我知道还有其他关于编译器/解释器技术的问题,以及像IronPython到侏罗纪这样的非常好的代码可以学习。对我来说很清楚如何从源代码构建 AST(抽象语法树),编写一个顶级解析器(目前我更喜欢编写而不是使用代码生成工具)。
当用作解释器时,我试图研究的大多数来源使用 Reflection.Emit 等 API 即时编译程序。现在我想知道构建一个不编译为 .NET VM 源的真正解释器的最佳实践。
获得 AST 后如何执行代码?我应该使用解释器还是访问者设计模式?或者做一些不同的事情?什么是最好的或规范的方式?
我知道已经有这样的问题,但如果可能的话,我喜欢更多信息,更具体地针对 .NET/C# 实现。
问候, 贾科莫
我在scala中寻找一个从抽象语法树生成JavaScript的库.我想在最终生成JavaScript的编译器中使用它,我不想自己实现漂亮的打印部分.
我经常需要在重构代码时重命名变量,我目前使用正则表达式以一种有点hacky的方式进行 - 由于缺乏实际结构,我最终不得不使用愚蠢的文本解决方法,例如,将“req”重命名为“request”并避免类似名称的副作用,如“需要”。
想想这些东西:这有点像用正则表达式修改 DOM:它不起作用。
我了解了 AST 和 Esprima 等代码结构修改工具。是否有重命名变量的工具,基于 Esprima 或其他?
我想知道我们是否可以使用Antlr版本4构建AST.我找不到使用antlr4构建它的任何参考.一个SO答案说,使用只生成解析树的antlr4很容易,但我的问题是效率如何呢?
它迫使我们抓取整个解析树而不是抽象语法树,这不是遍历整个树并使用访问者执行任务的有效方式.
我发现了一个ANTLRv4 Python3语法,但它生成了一个解析树,它通常有许多无用的节点.
我正在寻找一个已知的包从该解析树中获取Python AST.
这样的事情存在吗?
编辑:澄清使用Python ast包:我的项目是Java,我需要解析Python文件.
编辑2:'AST'我的意思是http://docs.python.org/2/library/ast.html#abstract-grammar,而'解析树'我的意思是http://docs.python.org/2 /reference/grammar.html.
我有一种情况,我期待一些引用的灵药代码是一个原子.如果传入错误的引用代码我想引发错误并显示错误代码是什么.
最简单的方式来展示我需要的是一个例子.
quoted_code = quote do: %{}
"%{}" = some_func(quoted_code)
Run Code Online (Sandbox Code Playgroud) 我正在通过AST变换开发一种小型编程语言.也就是说,从VM开始并慢慢添加帮助程序员的层.
由于每个层都知道如何转换它的新类型,我做了类似这样的事情:
module AST0 = struct
type t = [
| `Halt
| `In
| `Out
| `Add of (int * int * int)
| `Sub of (int * int * int)
]
let lower (ast : t list) = ast
end
module AST1 = struct
type t = [
AST0.t
| `Inc of int
| `Dec of int
| `Cmp of (int * int * int)
]
let lower (ast : t list) =
let lower_one = function
| …Run Code Online (Sandbox Code Playgroud) java ×3
antlr4 ×2
eclipse ×2
javascript ×2
antlr ×1
c# ×1
diff ×1
eclipse-jdt ×1
elixir ×1
interpreter ×1
ocaml ×1
parse-tree ×1
parsing ×1
python ×1
refactoring ×1
scala ×1