目前,我正在尋找一個框架,讓我來解析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