是否有一个ruby解析器生成器可以生成没有gem依赖项的解析器?

是否有一个ruby解析器生成器可以生成没有gem依赖项的解析器?,ruby,parsing,antlr,peg,Ruby,Parsing,Antlr,Peg,为了使DSL与ruby向后兼容,我需要对源字符串进行一些(相对简单的)解析。我可能可以直接使用字符串搜索,但是为了将来的可维护性,我想先研究一下如何使用合适的解析器生成器 然而,这个DSL的角色对我可以使用的rubygems设置了一个不寻常的限制。DSL是Xcode项目的一部分,该项目与CocoaPods一起分发,而CocoaPods实际上不是管理构建环境中的ruby依赖项 这意味着,我的rubyDSL实际上仅限于预装在Mac OS X 10.8上的gems 那么,我的问题是:是否有一个ruby

为了使DSL与ruby向后兼容,我需要对源字符串进行一些(相对简单的)解析。我可能可以直接使用字符串搜索,但是为了将来的可维护性,我想先研究一下如何使用合适的解析器生成器

然而,这个DSL的角色对我可以使用的rubygems设置了一个不寻常的限制。DSL是Xcode项目的一部分,该项目与CocoaPods一起分发,而CocoaPods实际上不是管理构建环境中的ruby依赖项

这意味着,我的rubyDSL实际上仅限于预装在Mac OS X 10.8上的gems

那么,我的问题是:是否有一个ruby解析器生成器生成“独立的”ruby代码作为其最终输出?意思是说ruby不需要
任何不属于核心ruby的东西的代码


我已经看过了antlrforruby的(稀疏的)文档,但它(可以理解)没有解决我的问题。从我对treetop的快速浏览中,它似乎使用了捆绑的支持包作为gem。

在进一步搜索后,我发现了rexicalgem,它本身是一个重命名的、略加维护的rex版本。这是一个老式的lexer生成器,它唯一的依赖是racc/parser,它作为ruby核心的一部分已经有足够长的时间了,我不必担心它

文档很少,但是有足够多的关于这个主题的博客帖子,我能够得到我需要的工作

如果您好奇地阅读了本文,下面是我的示例.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

这个lexer只理解足够的ruby语法来预处理用myvMATCodeMonkeyDSL编写的规范,用旧的rocket运算符语法替换新的关键字样式哈希键语法。[这样做是为了让vMATCodeMonkey能够在未更新的Mac OS X 10.8上工作,该操作系统仍然附带一个弃用版本的ruby

在进一步搜索后,我发现了rexicalgem,它本身是一个重命名的、稍加维护的rex版本。这是一个老式的lexer生成器,它唯一的依赖是racc/parser,它作为ruby核心的一部分已经有足够长的时间了,我不必担心它

文档很少,但是有足够多的关于这个主题的博客帖子,我能够得到我需要的工作

如果您好奇地阅读了本文,下面是我的示例.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
这个lexer只理解足够的ruby语法来预处理用myvMATCodeMonkeyDSL编写的规范,用旧的rocket运算符语法替换新的关键字样式哈希键语法。[这样做是为了让vMATCodeMonkey能够在未更新的Mac OS X 10.8上工作,该操作系统仍然附带一个弃用版本的ruby]