2013-04-30 135 views
1

爲了製作一個DSL我寫了向後兼容ruby​​ 1.8我需要對源字符串進行一些(相對直接的)分析。我可能會直接使用字符串消除,但爲了未來的可維護性,我想首先調查一下使用合適的解析器生成器需要做些什麼。是否有一個可以生成沒有gem依賴關係的解析器的ruby解析器生成器?

但是,這個DSL的作用對我可以使用的寶石提出了一個不尋常的限制。該DSL是一個與的CocoaPods,並的CocoaPods是不是真的有關在構建環境管理紅寶石依賴分佈式的的Xcode項目的一部分。

這意味着什麼,我紅寶石 DSL被有效限制爲船舶上的Mac OS X 10.8預裝的寶石。

SO,我的問題:是否有紅寶石解析器發電機,在那裏,產生「獨立」 紅寶石代碼作爲其最後的輸出?含義紅寶石代碼不require任何不是核心的一部分紅寶石

我已經看過的ANTLR(sparse)文檔,但它(可以理解)沒有解決我的問題。從我在treetop的快速瀏覽中,它確實使用了一個捆綁爲寶石的支持包。

回答

1

經過進一步搜索,我碰到了rexical的寶石,它本身就是雷克斯的重命名和偉略維護版本。這是一個老派的詞法分析器生成器,它只依賴於racc/parser,它已經成爲ruby​​-core的一部分,我不必擔心它。

文檔很少,但有足夠的博客文章涉及到我能夠獲得我需要的工作。

如果你足夠自信已經讀到這裏,這裏是我的榜樣.rex規格:

require 'generator' 

class OptionSpecsLexer 
rules 
    \d+(\.\d*)   { [:number, text] } 
    \w+:     { [:syntax_hash_key, ":#{text[0, text.length - 1]} =>"] } 
    \:\w+     { [:symbol, text] } 
    \w+\(    { [:funcall_open_paren, text] } 
    \w+     { [:identifier, text] } 
    \"(\\.|[^\\"])*\"  { [:string, text] } 
    =>     { [:rocket, text] } 
    ,      { [:comma, text] } 
    \{     { [:open_curly, text] } 
    \}     { [:close_curly, text] } 
    \(     { [:open_paren, text] } 
    \)     { [:close_paren, text] } 
    \[     { [:close_square, text] } 
    \]     { [:close_square, text] } 
    \\\s+     { } 
    \n     { [:eol, text] } 
    \s+     { } 

inner 

    def enumerate_tokens 
    Generator.new { |token| 
     loop { 
     t = next_token 
     break if t.nil? 
     token.yield(t) 
     } 
    } 
    end 

    def normalize(source) 
    scan_setup source 
    out = "" 
    enumerate_tokens.each do |token| 
     out += ' ' + token[1] 
    end 
    out 
    end 

end 

這詞法理解剛夠紅寶石語法預處理規範寫在我的vMATCodeMonkey DSL,用舊的火箭運營商語法替換新的關鍵字樣式的散列鍵語法。 [這樣做是爲了讓vMATCodeMonkey對未更新的的Mac OS X 10.8工作仍然附帶紅寶石的一個過時版本。]

相關問題