标签: abstract-syntax-tree

如何输出使用ANTLR构建的AST?

我正在为C做一个静态分析器.我已经使用ANTLR完成了词法分析器和解析器,其中生成了Java代码.

ANTLR会自动为我们构建AST options {output=AST;}吗?或者我必须自己制作树?如果是,那么如何吐出AST上的节点?

我目前认为AST上的节点将用于制作SSA,然后进行数据流分析以制作静态分析器.我在正确的道路上吗?

c antlr static-analysis abstract-syntax-tree

27
推荐指数
1
解决办法
2万
查看次数

使用Python将AST形式的Coq术语转换为波兰语表示法

假设我有一个任意的 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)

python tree abstract-syntax-tree coq

26
推荐指数
1
解决办法
518
查看次数

如何在Python中编写抽象语法树的访问者模式?

我的同事建议我写一个访客模式来导航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

25
推荐指数
3
解决办法
2万
查看次数

如何在Eclipse外的项目中使用java Eclipse Abstract Syntax Tree?(即不是eclipse插件)

如何在Eclipse外的项目中使用java Eclipse Abstract Syntax Tree?(即不是eclipse插件)

我见过的所有Eclipse AST示例都是针对eclipse插件的.有没有一种方法(即一个例子)项目使用eclipse AST进行非日食项目.

java eclipse abstract-syntax-tree

24
推荐指数
1
解决办法
8850
查看次数

Python代码生成器

我希望能够在给定AST描述的情况下执行python的代码生成.

我已经对C进行了静态分析,并在python中构建了AST访问者,所以我觉得操作语法树相对比较舒服,但我之前从未尝试过代码生成,并且正在尝试确定生成python代码的最佳实践.

具体来说,我喜欢关于如何自动完成代码生成的指针,或者指向可以使这个任务变得更简单的指向python的库的任何指针.

我的最终目标是尝试类似于csmith或工具的东西,使python代码符合PEP8.

python code-generation abstract-syntax-tree

24
推荐指数
2
解决办法
9566
查看次数

如何利用Clang的AST?

我正在考虑将Clang的AST用于我的C代码并对AST进行一些分析.关于从哪里开始,如何获得Clang的AST,教程或这方面的任何内容的一些指示将是非常有帮助的!

我一直试图找到一些,我得到了这个链接,这是2年前创建的.但由于某种原因,它不适合我.教程中的示例代码给出了太多错误.所以我不确定,如果我正确构建代码或者教程有些问题.但我也很乐意从其他一些页面开始.

c clang abstract-syntax-tree

23
推荐指数
2
解决办法
1万
查看次数

我可以在不使用编译器的情况下使用clang获得C/C++代码的XML AST转储吗?

我设法使用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不相等,我是否可能会遗漏这些内容.

xml code-generation clang abstract-syntax-tree

23
推荐指数
1
解决办法
1万
查看次数

PHP中正则表达式的解析器?

我需要在PHP中将正则表达式解析为它们的组件.我创建正则表达式或执行它们没有问题,但我想显示有关正则表达式的信息(例如列出捕获组,将重复字符附加到它们的目标,......).整个项目是WordPress的一个插件,它提供了有关重写规则的信息,这些规则是具有替换模式的正则表达式,并且可能很难理解.

我自己写了一个简单的实现,它似乎处理我抛出的简单正则表达式并将它们转换为语法树.在我扩展这个例子以支持更多op的正则表达式语法之前,我想知道是否还有其他好的实现我可以看一下.实现语言并不重要.我假设大多数解析器都是为了优化匹配速度而编写的,但这对我来说并不重要,甚至可能会妨碍清晰度.

php regex parsing abstract-syntax-tree

22
推荐指数
3
解决办法
2669
查看次数

如何比较两个源代码文件/ ast树?

我正在使用模板包生成一些源代码(有更好的方法吗?)和部分测试我需要检查输出是否与预期的源代码匹配.

  • 我尝试了一个字符串比较但由于模板包生成了额外的空格/新行而失败了.我也尝试过format.Source但没有成功.(失败)
  • 我试图解析两个来源的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)

parsing compare abstract-syntax-tree go

22
推荐指数
2
解决办法
951
查看次数

解析器组合器,分离语法和AST结构

我正在使用解析器 - 组合器库在Scala中编写一个简单的函数式编程语言.

语法在此处指定:https://github.com/hejfelix/Frase/blob/master/src/main/scala/it/vigtig/lambda/ParserLike.scala

有一件事我无法通过实现来解决:如何将语法定义与转换为AST节点分开?

直接在解析器源中使用接近人类可读的语法真的很酷,特别是考虑到我是项目ATM上唯一的程序员,它可以作为文档.

如何分离语法和AST特定代码?

grammar scala abstract-syntax-tree parser-combinators

22
推荐指数
1
解决办法
1117
查看次数