目前,我正在寻找一个框架,让我来解析Ruby代码和代码转换成concrete syntax tree。框架红宝石解析/静态代码分析
我已经采取了看看Rubyparser,这是我有意去的方向,但它给了我一个抽象语法树来代替。
另一种方法是拆开一个工具,建立一个CST(也许Pelusa或类似的东西)。
你有什么建议吗?它应该用Ruby编写,所以我不能使用原始的Ruby解析器。
目前,我正在寻找一个框架,让我来解析Ruby代码和代码转换成concrete syntax tree。框架红宝石解析/静态代码分析
我已经采取了看看Rubyparser,这是我有意去的方向,但它给了我一个抽象语法树来代替。
另一种方法是拆开一个工具,建立一个CST(也许Pelusa或类似的东西)。
你有什么建议吗?它应该用Ruby编写,所以我不能使用原始的Ruby解析器。
我不确定你正在尝试做什么,但看看Treetop它可以让你定义一个语法文件,并将语法编译到Ruby中的解析器。它是一个PEG解析器,所以它比传统的LALR解析器更容易工作。
下面是一个例子解析位红宝石(当然,你将不得不延长语法来满足您的需求可能是困难的,因为Ruby是相当复杂解析):
require 'treetop'
Treetop.load_from_string DATA.read
parser = TestParser.new
p parser.parse('def func
6 + 5
end')
__END__
grammar Test
rule function
'def' space function_name function_body 'end'
end
rule function_name
[A-Za-z]+
end
rule function_body
space expression space
end
rule expression
'6 + 5'
end
rule space
[\t \n]+
end
end
解析这个返回AST:
SyntaxNode+Function0 offset=0, "...ef func\n 6 + 5\nend" (space,function_name,function_body):
SyntaxNode offset=0, "def"
SyntaxNode offset=3, " ":
SyntaxNode offset=3, " "
SyntaxNode offset=4, "func":
SyntaxNode offset=4, "f"
SyntaxNode offset=5, "u"
SyntaxNode offset=6, "n"
SyntaxNode offset=7, "c"
SyntaxNode+FunctionBody0 offset=8, "\n 6 + 5\n" (space1,expression,space2):
SyntaxNode offset=8, "\n ":
SyntaxNode offset=8, "\n"
SyntaxNode offset=9, " "
SyntaxNode offset=10, " "
SyntaxNode offset=11, " "
SyntaxNode offset=12, "6 + 5"
SyntaxNode offset=17, "\n":
SyntaxNode offset=17, "\n"
SyntaxNode offset=18, "end"
此外,您还可以使用tt
命令行工具编译树顶语法文件到Ruby代码。
tt test.treetop -o test-treetop.rb
我的问题是,而我没有写红宝石语法+语义分析的时间和精力。 Rubyparser为Ruby提供了一个很好的工作语法,所以这已经是第一步了。下一个是做语义分析。 (见http://en.wikipedia.org/wiki/Semantic_analysis_%28compilers%29#Front_end)这就是RubyParser的缺失部分。明天我会为这个问题添加细节。感谢您的帮助。 – romedius
如果以前没有做过,我不会感到惊讶。你是否希望完成Ruby的所有工作(有点像元圆评估者......)?它看起来并不像一个完整的树顶语法反正存在:[http://stackoverflow.com/a/4055743/1177119](http://stackoverflow.com/a/4055743/1177119) –
我知道那几个人试图为不同的解析框架实现语法,但他们不得不放弃,或在一段时间后交给其他人。 – romedius
相关:http://stackoverflow.com/a/4055743/1004889 – pje
你试过洞穴探险到JRuby的?它编译成红宝石JVM ... – dpassage
这可能会是解决方案......我们将使用JRuby的反正,但我想保持它的平台无关。 – romedius