我们有生成Java源代码的需求。我们通过对抽象语法树建模并使用树遍历器生成实际的源代码文本来做到这一点。这一切都很好。
由于我的 AST 代码有点旧,它不支持注释和泛型。因此,我正在寻找开放项目,以用于 future 需要代码生成的项目。这就是实际问题的来源。我们想要测试生成的代码是否具有正确的行为。
这就是我产生实际评估 AST 而不是生成 Java 源代码、编译它并针对该代码运行测试的想法的地方。评估者将加快单元测试,并且可以评估更小的生成代码片段,例如仅评估一种方法,从而使“单元”更加合理。
到目前为止,我发现 com.sun.codemodel 项目作为现代(支持 java5 和 6 功能)基于 AST 的代码生成解决方案似乎相当不错。
任何人都知道是否有另一个项目可以让我直接评估 AST 的片段(例如单个生成的方法)?
最佳答案
要评估 Java,您需要对其进行所有语义分析(“这个标识符的范围是什么?它有什么类型?”)以及一个解释器。
要进行语义分析,您需要的不仅仅是 AST:您需要全名解析(符号表构建)和类型解析(确定表达式类型并验证表达式在它们所在的上下文中是否有效) , 以及类查找(foo 指的是哪个实际方法?)
有了它,您可以考虑通过按执行顺序在树上爬行来构建解释器。您还需要构建一个存储管理器;你可能不需要做一个完整的垃圾收集器,但你需要一些东西。您还需要一名口译员 对于 .class 文件,如果你真的想运行一些东西,这意味着你需要一个解析器 (以及类文件的名称/类型解析)。
我不知道 Eclipse 是否具备所有这些功能(至少您可以免费获得存储管理器部分 :)。考虑到它的最初设计是支持 Java 开发,我有点期待它,但多年来我对许多工具感到非常失望。
DMS Software Reengineering Toolkit也是处理多种语言的程序分析/转换。它有一个完整的 Java front end包括解析、AST 构建、符号表构建和名称解析、类型解析、构建调用图(解析虚函数调用所需),并有一个 .class 文件阅读器以名称解析启动。因此,这将是构建解释器的良好基础。
DMS 也可以构造任意 AST,然后从中生成源代码,因此它也可以处理代码生成端,就好了。
[DMS 存在的原因是“非常失望”的部分]。
关于java - 生成 Java 代码解析树并对其进行评估以进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1431980/
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。