我正在为C做一个静态分析器.我已经使用ANTLR完成了词法分析器和解析器,其中生成了Java代码.
ANTLR会自动为我们构建AST options {output=AST;}吗?或者我必须自己制作树?如果是,那么如何吐出AST上的节点?
我目前认为AST上的节点将用于制作SSA,然后进行数据流分析以制作静态分析器.我在正确的道路上吗?
假设我有一个任意的 Coq术语(使用s-expressions / sexp的AST格式),例如:
n = n + n
我想自动将其转换为:
= n + n n
通过遍历AST树(由于sexp,它是列表的嵌套列表)。Python中是否有可以执行此操作的标准库?
现在,如果我要写下要执行的算法/伪代码(假设我可以将sexp转换为某些实际的树对象):
def ToPolish():
'''
"postfix" tree traversal
'''
text = ''
for node in root.children:
if node is atoms:
text := text + node.text
else:
text := text + ToPolish(node,text)
return text
Run Code Online (Sandbox Code Playgroud)
我认为这很接近,但我认为某处存在一个小错误...
AST示例:
(ObjList
((CoqGoal
((fg_goals
(((name 4)
(ty
(App
(Ind
(((Mutind (MPfile (DirPath ((Id Logic) (Id Init) (Id Coq))))
(DirPath ()) (Id eq))
0)
(Instance ())))
((Ind
(((Mutind (MPfile (DirPath ((Id …Run Code Online (Sandbox Code Playgroud) 我的同事建议我写一个访客模式来导航AST.任何人都可以告诉我更多我将如何开始写它?
据我所知,AST中的每个Node都有visit()方法(?)以某种方式被调用(从哪里?).这总结了我的理解.
为了简化一切,假设我有节点Root,Expression,Number,Op和树是这个样子:
Root
|
Op(+)
/ \
/ \
Number(5) \
Op(*)
/ \
/ \
/ \
Number(2) Number(444)
Run Code Online (Sandbox Code Playgroud)
任何人都可以想到访问者模式将如何访问此树以产生输出:
5 + 2 * 444
Run Code Online (Sandbox Code Playgroud)
谢谢,Boda Cydo.
python compiler-construction parsing visitor abstract-syntax-tree
如何在Eclipse外的项目中使用java Eclipse Abstract Syntax Tree?(即不是eclipse插件)
我见过的所有Eclipse AST示例都是针对eclipse插件的.有没有一种方法(即一个例子)项目使用eclipse AST进行非日食项目.
我希望能够在给定AST描述的情况下执行python的代码生成.
我已经对C进行了静态分析,并在python中构建了AST访问者,所以我觉得操作语法树相对比较舒服,但我之前从未尝试过代码生成,并且正在尝试确定生成python代码的最佳实践.
具体来说,我喜欢关于如何自动完成代码生成的指针,或者指向可以使这个任务变得更简单的指向python的库的任何指针.
我正在考虑将Clang的AST用于我的C代码并对AST进行一些分析.关于从哪里开始,如何获得Clang的AST,教程或这方面的任何内容的一些指示将是非常有帮助的!
我一直试图找到一些,我得到了这个链接,这是2年前创建的.但由于某种原因,它不适合我.教程中的示例代码给出了太多错误.所以我不确定,如果我正确构建代码或者教程有些问题.但我也很乐意从其他一些页面开始.
我设法使用cmake和visual studio 10成功编译了用于Windows的窗口.我想获得一个XML文件作为源代码的AST表示.有一个选项可以在linux(ubuntu)下使用gcc提供结果,但是在windows框中不起作用:
clang -cc1 -ast-print-xml source.c
Run Code Online (Sandbox Code Playgroud)
但是,这是调用编译阶段(我想避免).挖掘源代码并没有帮助我,因为我很吵.我可以通过使用以下方法设法生成AST的二进制版本:
clang -emit-ast source.c
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种格式不能直接用于解析.是否有一些现有方法直接生成XML树而不是clang中的二进制树?
目标是在.NET环境中的其他工具中使用XML表示,因此我需要围绕本机clang lib进行一些包装以访问二进制AST.如果有人已经为.NET编写了一些二进制clang AST解析器,可能还有第三种选择吗?
如果clang前端生成的AST与编译阶段生成的AST不相等,我是否可能会遗漏这些内容.
我需要在PHP中将正则表达式解析为它们的组件.我创建正则表达式或执行它们没有问题,但我想显示有关正则表达式的信息(例如列出捕获组,将重复字符附加到它们的目标,......).整个项目是WordPress的一个插件,它提供了有关重写规则的信息,这些规则是具有替换模式的正则表达式,并且可能很难理解.
我自己写了一个简单的实现,它似乎处理我抛出的简单正则表达式并将它们转换为语法树.在我扩展这个例子以支持更多op的正则表达式语法之前,我想知道是否还有其他好的实现我可以看一下.实现语言并不重要.我假设大多数解析器都是为了优化匹配速度而编写的,但这对我来说并不重要,甚至可能会妨碍清晰度.
我正在使用模板包生成一些源代码(有更好的方法吗?)和部分测试我需要检查输出是否与预期的源代码匹配.
我试图解析两个来源的ast(见下文),但即使代码基本相同,除了新的行/空格,ast也不匹配.(失败)
包主
import (
"fmt"
"go/parser"
"go/token"
"reflect"
)
func main() {
stub1 := `package main
func myfunc(s string) error {
return nil
}`
stub2 := `package main
func myfunc(s string) error {
return nil
}`
fset := token.NewFileSet()
r1, err := parser.ParseFile(fset, "", stub1, parser.AllErrors)
if err != nil {
panic(err)
}
fset = token.NewFileSet()
r2, err := parser.ParseFile(fset, "", stub2, parser.AllErrors)
if err != nil {
panic(err)
}
if !reflect.DeepEqual(r1, r2) { …Run Code Online (Sandbox Code Playgroud)我正在使用解析器 - 组合器库在Scala中编写一个简单的函数式编程语言.
语法在此处指定:https://github.com/hejfelix/Frase/blob/master/src/main/scala/it/vigtig/lambda/ParserLike.scala
有一件事我无法通过实现来解决:如何将语法定义与转换为AST节点分开?
直接在解析器源中使用接近人类可读的语法真的很酷,特别是考虑到我是项目ATM上唯一的程序员,它可以作为文档.
如何分离语法和AST特定代码?