标签: abstract-syntax-tree

用于将C++解析为AST的工具

请建议一个现成的工具,用于将C++代码解析为抽象语法树?基于Lex/Yacc的工具将是首选,但其他任何东西也是可以接受的.

c++ parsing abstract-syntax-tree

14
推荐指数
3
解决办法
7648
查看次数

Groovy中@Delegate和@Mixin AST转换之间的区别

Groovy中@Delegate@Mixin AST转换之间有什么区别?

也许我的问题与OO有关,当应用不同的模式时,我使用两者并且我可以实现相同的行为.

class Person {
    String name = "Clark"
    def walk() { "Walk" }
}

@Mixin(Person)
class Superhero {
    def fly() { "Fly" }
}

def superman = new Superhero()
assert superman.name == "Clark"
assert superman.walk() == "Walk"
assert superman.fly() == "Fly"
Run Code Online (Sandbox Code Playgroud)
class Person {
    String name = "Clark"
    def walk() { "Walk" }
}

class Superhero {
    @Delegate Person person
    def fly() { "Fly" }
}

def superman = new Superhero(person: new Person())
assert superman.name …
Run Code Online (Sandbox Code Playgroud)

groovy design-patterns delegation abstract-syntax-tree mixins

14
推荐指数
1
解决办法
1806
查看次数

解析SQL语法,设计模式

我正在尝试使用模拟sql语法来构建一个简单的sql,类似于键值存储的接口.这些值基本上是POJO

一个例子是

select A.B.C from OBJ_POOL where A.B.X = 45 AND A.B.Y > '88' AND A.B.Z != 'abc';
Run Code Online (Sandbox Code Playgroud)

OBJ_POOL只是同一类POJO的列表.在这个例子中,A将是基类.

Class A
    Class B
        String C
        Integer X
        String Y
        String Z
Run Code Online (Sandbox Code Playgroud)

现在ABC相当于A.getB().getC()

我使用Antlr解析上面的语句来获取AST,然后hoping使用Apache BeanUtils反射获取/设置字段名称.

我写了构建AST的语法 AST为上述声明 现在我面临两个问题

  1. 如何为where子句实现访问者?ABX = 45表示所有对象的字段X都为45,如何进行过滤是否有任何好方法可以做到这一点?
  2. 有没有办法遍历生成的AST而不会使用自定义逻辑(存储访问,属性getter/setter等)使访问者代码混乱.

第二个问题更令人担忧,因为声明可能会做很多事情.

简而言之,任何建议/链接/设计模式,以很好地解析sql选择语句的一小部分将不胜感激

谢谢

java sql design-patterns antlr abstract-syntax-tree

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

如何在语法上实现JJTree

我有一个任务是使用JavaCC为讲师提供的语言制作一个带有语义分析的自上而下的解析器.我已经写出了生产规则,没有错误.我完全坚持如何将JJTree用于我的代码,而我在互联网上搜索教程的时间并没有让我任何地方.只是想知道是否有人可以抽出时间来解释如何在代码中实现JJTree?或者,如果有一个隐藏的分步教程那里的某个地方将是一个很大的帮助!

以下是我的一些生产规则,以防他们提供帮助.提前致谢!

void program() : {}
{
  (decl())* (function())* main_prog()
}

void decl() #void : {}
{
  (
    var_decl() | const_decl()
   )
}

void var_decl() #void : {}
{
  <VAR> ident_list() <COLON> type()
 (<COMMA> ident_list() <COLON> type())* <SEMIC>
}

void const_decl()  #void : {}
{
  <CONSTANT> identifier() <COLON> type() <EQUAL> expression()
 ( <COMMA> identifier() <COLON> type() <EQUAL > expression())* <SEMIC>
} 

void function() #void : {}
{
  type() identifier() <LBR> param_list() <RBR>
  <CBL>
  (decl())*
  (statement() <SEMIC> )*
  returnRule() (expression() | …
Run Code Online (Sandbox Code Playgroud)

java compiler-construction parsing javacc abstract-syntax-tree

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

如何将gcc生成的抽象语法树转储到.dot文件中?

我认为问题的标题是自解释的,我想将gcc生成的抽象语法树转储到.dot文件(由Graphviz生成的那些文件),因为那时我想在.png文件或类似文件中查看它.有什么方法可以做到吗?

提前致谢 :)

gcc dot abstract-syntax-tree graphviz

14
推荐指数
2
解决办法
8218
查看次数

如何在C#中为抽象语法树编写访问者模式?

我必须写一个访问者模式来导航AST.任何人都可以告诉我更多我将如何开始写它?据我所知,AST中的每个节点都有visit()方法(?),它会以某种方式被调用(从哪里?).这总结了我的理解.为了简化一切,假设我有节点Root,Expression,Number,Op,树看起来像这样:

      Root
        |
       Op(+)
      /   \
     /     \
 Number(5)  \
             Op(*)
             /   \
            /     \
           /       \
       Number(2)   Number(444)
Run Code Online (Sandbox Code Playgroud)

c# abstract-syntax-tree visitor-pattern

14
推荐指数
1
解决办法
6469
查看次数

如何获取对应于Python AST节点的源代码?

Python AST节点具有linenocol_offset属性,它们指示相应代码范围的开始.是否有一种简单的方法可以获得代码范围的结束?第三方图书馆?

python abstract-syntax-tree

14
推荐指数
3
解决办法
3641
查看次数

如何在通用遍历解析树的同时访问ANTLR4中的备用标签?

如何在通用遍历解析树的同时访问ANTLR4中的备用标签?或者,是否有任何方法可以复制^ANTLR3 的运算符的功能,因为这样可以解决问题.

我正在尝试为任何符合简单方法的ANTLR4语法编写AST漂亮的打印机(比如用替代标签命名产品).我希望能够打印出更漂亮的一个术语类似3 + 5(int_expression (plus (int_literal 3) (int_literal 5))),或类似的东西,给出类似下面的语法:

int_expression 
    : int_expression '+' int_expression # plus
    | int_expression '-' int_expression # minus
    | raw_int                           # int_literal
    ;
raw_int
    : Int
    ;
Int : [0-9]+ ;
Run Code Online (Sandbox Code Playgroud)

我无法有效地为制作plusminus制作命名,因为将它们拉到自己的制作中会导致工具抱怨规则是相互左递归的.如果我不能把它们拉出来,我怎么能给这些作品命名呢?

注1:+通过将"好"终端(例如,Int上面的)放在特殊制作中(以特殊前缀开头的制作等raw_),我能够在方法论上摆脱论证.然后,我只能打印那些父作品被命名为" raw_......"而终止所有其他作品的终端.这非常适合摆脱+,同时保持35输出.这可以通过!ANTLR3完成.

注意2:我知道我可以编写一个专门的漂亮的打印机或为给定语言的每个产生使用动作,但我想使用ANTLR4来解析和生成各种语言的AST,看起来我应该是能够编写如此简单漂亮的打印机.换句话说,我只关心获得AST,而我宁愿不用每个语法来使用量身定制的漂亮打印机来获取AST.也许我应该回到ANTLR3?

pretty-print abstract-syntax-tree antlr4

14
推荐指数
1
解决办法
944
查看次数

从Python AST生成.pyc?

我如何从Python AST生成.pyc文件,以便我可以从Python导入文件?

我曾经compile创建过一个代码对象,然后将co_code属性写入文件,但是当我尝试从Python导入文件时,我得到了一个ImportError: Bad magic number in output.pyc.

python bytecode abstract-syntax-tree

13
推荐指数
1
解决办法
2522
查看次数

是否可以在编译之前使用实例化模板查看C++代码(g ++)?

g ++编译器有一个生成宏扩展代码(-E)的标志,所以我想知道在实际编译发生之前是否有一种方法可以在模板实例化之后查看程序.

c++ templates g++ instantiation abstract-syntax-tree

13
推荐指数
1
解决办法
1538
查看次数