2012-10-05 55 views
3

目前,我正在寻找一个框架,让我来解析Ruby代码和代码转换成concrete syntax tree框架红宝石解析/静态代码分析

我已经采取了看看Rubyparser,这是我有意去的方向,但它给了我一个抽象语法树来代替。

另一种方法是拆开一个工具,建立一个CST(也许Pelusa或类似的东西)。

你有什么建议吗?它应该用Ruby编写,所以我不能使用原始的Ruby解析器。

+1

相关:http://stackoverflow.com/a/4055743/1004889 – pje

+0

你试过洞穴探险到JRuby的?它编译成红宝石JVM ... – dpassage

+0

这可能会是解决方案......我们将使用JRuby的反正,但我想保持它的平台无关。 – romedius

回答

3

我不确定你正在尝试做什么,但看看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 
+1

我的问题是,而我没有写红宝石语法+语义分析的时间和精力。 Rubyparser为Ruby提供了一个很好的工作语法,所以这已经是第一步了。下一个是做语义分析。 (见http://en.wikipedia.org/wiki/Semantic_analysis_%28compilers%29#Front_end)这就是RubyParser的缺失部分。明天我会为这个问题添加细节。感谢您的帮助。 – romedius

+0

如果以前没有做过,我不会感到惊讶。你是否希望完成Ruby的所有工作(有点像元圆评估者......)?它看起来并不像一个完整的树顶语法反正存在:[http://stackoverflow.com/a/4055743/1177119](http://stackoverflow.com/a/4055743/1177119) –

+0

我知道那几个人试图为不同的解析框架实现语法,但他们不得不放弃,或在一段时间后交给其他人。 – romedius