2012-10-05 84 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