【问题标题】:Is there a parser generator for ruby that can generate a parser with no gem dependencies?是否有用于 ruby​​ 的解析器生成器可以生成没有 gem 依赖项的解析器?
【发布时间】:2013-05-03 09:35:26
【问题描述】:

为了使我编写的 DSL 与 ruby 1.8 向后兼容,我需要对源字符串进行一些(相对简单的)解析。我可能可以直接使用字符串处理,但为了将来的可维护性,我想先调查一下使用适当的解析器生成器需要什么。

然而,这个 DSL 的作用对我可以使用哪些 ruby gems 提出了不同寻常的限制。 DSL 是与 CocoaPods 一起分发的 Xcode 项目的一部分,而 CocoaPods 并不是真正管理 ruby 依赖项在构建环境中。

这意味着,我的 ruby DSL 实际上仅限于预装在 Mac OS X 10.8 上的 gem。

SO,我的问题:是否有 ruby 解析器生成器可以生成“独立”ruby 代码作为其最终输出?意思是 ruby 代码不 require 任何不属于核心 ruby 的内容?

我查看了 ANTLR for Ruby 的(稀疏)文档,但它(可以理解)并没有解决我的问题。从我对 treetop 的快速浏览来看,它似乎使用了作为 gem 捆绑的支持包。

【问题讨论】:

    标签: ruby parsing antlr peg


    【解决方案1】:

    经过进一步搜索,我发现了 rexical gem,它本身就是 rex 的一个重命名和稍微维护的版本。这是一个老式的词法分析器生成器,它唯一的依赖项是 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
    

    这个词法分析器理解足够的 ruby 语法来预处理用我的 vMATCodeMonkey DSL 编写的规范,将新的 keyword 样式的哈希键语法替换为旧的 rocket operator 语法。 [这样做是为了让 vMATCodeMonkey 可以在未更新的 Mac OS X 10.8 上工作,该版本仍然带有已弃用的 ruby 版本。]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多