LINQ表达式树可以做什么最大化?
它可以定义一个类吗?如何使用所有声明的名称,修饰符,参数类型和返回类型的方法?
程序是否必须自己定义树?是否可以从给定的C#文件生成树?
我在哪里可以获得有关编写基本到高级表达式树和表达式树访问者的资源?(文章和视频会很棒)
感谢那些能够提供帮助的人......
我一直在阅读这篇题为" 使用抽象语法树进行克隆检测"的文章,由Ira D. Baxter等人撰写.我在下面转载的论文中有一段:
原则上,查找子树克隆很容易:将每个子树与每个其他子树进行比较以获得相等性.在实践中,出现了几个问题:接近错过克隆检测,亚克隆和规模....
当找到接近未命中的克隆时,完整子树上的散列会精确失败,因为良好的散列函数包括树的所有元素,因此将轻微的差异排序到不同的桶中.我们通过选择人为错误的哈希函数来解决这个问题 .必须以这样的方式表征该函数,即保留想要在近未命中克隆上找到的主要属性.接近未命中克隆通常通过复制和粘贴程序创建,然后进行少量修改.这些修改通常会对与复制的代码段相关联的树的形状进行小的更改.因此,我们认为这种近乎未命中的克隆通常只有一些不同的小子树.基于这种观察,忽略小子树的散列函数是一个很好的选择.在这里给出的实验中,我们使用了一个哈希函数,它只忽略标识符名称(树中的叶子).因此,我们的散列函数将具有相似模数标识符的树放入相同的散列区中以进行比较.
我正在尝试实现本文中讨论的技术,但我仍然试图理解这一段(不幸的是在论文的开头).我理解段落的内容,但作者没有提到要选择的哈希函数或如何实际哈希AST.有人可以从实施的角度用一个简单的例子解释一下吗?
language-agnostic compiler-construction algorithm parsing abstract-syntax-tree
我有我想象的将是一个相当复杂的技术挑战:我希望能够以多种语言(尽可能多的)可靠地对重命名标识符进行alpha重命名.这需要特别考虑每种语言,我正在寻求建议,以便通过共享代码来最大限度地减少我需要做的工作量.像已经支持多种语言的统一解析或抽象语法框架这样的东西会很棒.
例如,这是一些python代码:
def foo(x):
def bar(y):
return x+y
return bar
Run Code Online (Sandbox Code Playgroud)
的α重命名x以y 改变x到y和保持语义.所以它会成为:
def foo(y):
def bar(y1):
return y+y1
return bar
Run Code Online (Sandbox Code Playgroud)
了解我们如何重命名y以y1避免破坏代码?这就是为什么这是一个难题.似乎程序必须非常了解构成范围的内容,而不仅仅是进行字符串搜索和替换.
我还想尽可能多地保留格式:注释,间距,缩进.但这不是100%必要的,它会很好.
有小费吗?
我正在为Eclipse JDT编写一些简单的AST访问者.我有一个MethodVisitor和FieldVisitor每个扩展的类ASTVisitor.举个MethodVisitor例子.在该类的Visit方法(这是一个覆盖),我能够找到每个MethodDeclaration节点.当我有其中一个节点时,我想查看它Modifiers是否是它(public或者private也许是其他修饰符).有一个方法叫做getModifiers(),但我不清楚如何使用它来确定应用于特定的修饰符的类型MethodDeclaration.我的代码发布在下面,如果您有任何想法如何继续,请告诉我.
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.MethodDeclaration;
public class MethodVisitor extends ASTVisitor {
private List<MethodDeclaration> methods;
// Constructor(s)
public MethodVisitor() {
this.methods = new ArrayList<MethodDeclaration>();
}
/**
* visit - this overrides the ASTVisitor's visit and allows this
* class to visit MethodDeclaration nodes in the AST.
*/
@Override
public boolean visit(MethodDeclaration node) {
this.methods.add(node); …Run Code Online (Sandbox Code Playgroud) java modifier abstract-syntax-tree visitor-pattern eclipse-jdt
我安装了JDT插件(我正在运行Eclipse 4.2.1),但Eclipse无法识别某些类型和类.例如,我得到"CompilationUnit无法解析为类型".我是否必须导入Eclipse不建议的内容?
我正在使用python的ast模块来显示类继承树.
我为a定义了一个visit_ClassDef(self, node)函数ast.NodeVisitor,并进行迭代node.bases.
但是,我一直无法将基类的名称作为字符串.到目前为止,我已经试过base.value和base.name,但无济于事.
我正在寻找Groovy AST转换,它将在我的类中生成构建器模式代码.
我知道有类似@Canonnical或@ToString或@EqualsAndHashCode增强自动生成有用的方法,并希望是否会有@GenerateBuilder.我想用它这样的东西:
//Groovy code:
@GenerateBuilder
@CompileStatic
class Person {
String name
int age
Long id
String createdBy
}
//then in Java code:
Person p = Person.newBuilder()
.withName("pawel")
.withAge(19)
.withId(11123)
.withCreatedBy("system")
.build();
Run Code Online (Sandbox Code Playgroud) 我正在用C++编写一个解释器,到目前为止我已经有了生成令牌的词法分析器了.问题是我不确定如何生成一个解析树的"walk".
我正在考虑使用数组数组来制作我的解析树,但我不确定如何以正确的顺序将令牌实际插入到解析树中.
我不确定是否自上而下,左右或自下而上,左右.
任何人都可以为我提供简单的LALR(1)算法吗?
考虑下面的代码:
1 | x = 20
2 |
3 | def f():
4 | x = 0
5 | for x in range(10):
6 | x += 10
7 | return x
8 | f()
9 |
10| for x in range(10):
11| pass
12| x += 1
13| print(x)
Run Code Online (Sandbox Code Playgroud)
的值x的代码的执行之后以上10。现在,我怎么能得到所有一流的节点Name,其ids为x并指x这是一个在线路1,10,12和13被使用?
换句话说,的x内部f与xs 的其余部分不同。是否可以获取仅具有脚本和脚本的AST而不执行脚本的AST节点?
我试图了解执行python代码的过程。假设源具有函数定义。使用ast.parse(),我将其解析为一个ast,它将包含该FunctionDef节点类的实例。该节点实例不是可调用的,并且与函数对象不同。如何从这个ast创建具有所有dunder属性的函数对象?