2013-04-30 89 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工作仍然附带红宝石的一个过时版本。]

相关问题