2

私が作成した DSL をruby​​ 1.8との下位互換性を持つようにするために、ソース文字列に対して (比較的単純な) 解析を行う必要があります。おそらく文字列変更を直接行うこともできますが、将来の保守性のために、最初に調査して、適切なパーサー ジェネレーターを使用するには何が必要かを調べたいと思いました。

ただし、この DSL の役割により、使用できるruby​​ gem に異常な制約が課されます。DSL はCocoaPodsと共に配布されるXcodeプロジェクトの一部であり、CocoaPodsはビルド環境でRubyの依存関係を管理するためのものではありません。

これが意味することは、私のruby​​ DSL は、 Mac OS X 10.8にプリインストールされて出荷される gem に効果的に制限されているということです。

SO、私の質問:最終出力として「スタンドアロン」のRubyコードを生成するRubyパーサー ジェネレーターはありますか? コアruby​​ の一部ではないものを何もしないruby​​ コードを意味しますか?require

ANTLR for Rubyの(まばらな)ドキュメントを見てきましたが、(当然のことながら)私の質問には対応していません。また、treetopをざっと見たところ、gem としてバンドルされたサポート パッケージを使用しているようです。

4

1 に答える 1

1

さらに検索した後、 rexの名前が変更され、わずかに維持されたバージョンであるrexical gem に出会いました。これは古い学校のレクサージェネレーターであり、依存関係は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 で記述された仕様を前処理するのに十分なRuby構文を理解し、新しいキーワード形式のハッシュ キー構文を古いロケット オペレーター構文に置き換えます。[これは、vMATCodeMonkeyが更新されていないMac OS X 10.8で動作できるようにするために行われました。この Mac OS X 10.8 には、廃止されたバージョンのruby​​ が同梱されています。]

于 2013-05-03T01:35:26.327 に答える