请建议一个现成的工具,用于将C++代码解析为抽象语法树?基于Lex/Yacc的工具将是首选,但其他任何东西也是可以接受的.
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
我正在尝试使用模拟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的语法
现在我面临两个问题
第二个问题更令人担忧,因为声明可能会做很多事情.
简而言之,任何建议/链接/设计模式,以很好地解析sql选择语句的一小部分将不胜感激
谢谢
我有一个任务是使用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
我认为问题的标题是自解释的,我想将gcc生成的抽象语法树转储到.dot文件(由Graphviz生成的那些文件),因为那时我想在.png文件或类似文件中查看它.有什么方法可以做到吗?
提前致谢 :)
我必须写一个访问者模式来导航AST.任何人都可以告诉我更多我将如何开始写它?据我所知,AST中的每个节点都有visit()方法(?),它会以某种方式被调用(从哪里?).这总结了我的理解.为了简化一切,假设我有节点Root,Expression,Number,Op,树看起来像这样:
Root
|
Op(+)
/ \
/ \
Number(5) \
Op(*)
/ \
/ \
/ \
Number(2) Number(444)
Run Code Online (Sandbox Code Playgroud) Python AST节点具有lineno和col_offset属性,它们指示相应代码范围的开始.是否有一种简单的方法可以获得代码范围的结束?第三方图书馆?
如何在通用遍历解析树的同时访问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)
我无法有效地为制作plus和minus制作命名,因为将它们拉到自己的制作中会导致工具抱怨规则是相互左递归的.如果我不能把它们拉出来,我怎么能给这些作品命名呢?
注1:+通过将"好"终端(例如,Int上面的)放在特殊制作中(以特殊前缀开头的制作等raw_),我能够在方法论上摆脱论证.然后,我只能打印那些父作品被命名为" raw_......"而终止所有其他作品的终端.这非常适合摆脱+,同时保持3和5输出.这可以通过!ANTLR3完成.
注意2:我知道我可以编写一个专门的漂亮的打印机或为给定语言的每个产生使用动作,但我想使用ANTLR4来解析和生成各种语言的AST,看起来我应该是能够编写如此简单漂亮的打印机.换句话说,我只关心获得AST,而我宁愿不用每个语法来使用量身定制的漂亮打印机来获取AST.也许我应该回到ANTLR3?
我如何从Python AST生成.pyc文件,以便我可以从Python导入文件?
我曾经compile创建过一个代码对象,然后将co_code属性写入文件,但是当我尝试从Python导入文件时,我得到了一个ImportError: Bad magic number in output.pyc.
g ++编译器有一个生成宏扩展代码(-E)的标志,所以我想知道在实际编译发生之前是否有一种方法可以在模板实例化之后查看程序.