質問

私は使用しようとしています ツリートップ ERBファイルを解析します。次のような線を処理できる必要があります。

<% ruby_code_here %>
<%= other_ruby_code %>

TreeTopはRubyで書かれており、RubyにTreeTopの文法を書いているので、TreeTopに「ねえ、ここでRubyコードを探して、故障を与えてください」と言うために、既存の方法があります。ルビー言語のすべての部分?私は私の中で方法を探しています .treetop 文法ファイル、次のようなものを持っています:

rule erb_tag
  "<%" ruby_code "%>" {
    def content
      ...
    end
  }
end

どこ ruby_code TreeTopが提供するいくつかのルールによって処理されます。

編集: 他の誰か Ruby-Exを使用してERBを解析しましたが、彼がしたことを再現しようとするエラーがありました。 Rlexプログラムは、パーサークラスを生成したときに完全なクラスを生成しませんでした。

編集: そうですね、あなたは多くのことを憂鬱にしていますが、情報をありがとう。 :)私のマスターのプロジェクトのために、私は入力としてERBを使用する必要があるテストケースジェネレーターを書いています。幸いなことに、私の目的のために、私はERBコードのいくつかのことを認識する必要があります。 if ステートメントおよびその他の条件、およびループ。 Rubyのために完全ではないという警告で、TreeTopの文法を考え出すことができると思います。

役に立ちましたか?

解決

私の知る限り、Rubyのツリートップ文法をまだ作成した人はいません。 (実際、誰も作成できなかった どれか MRIとYARVに出荷するYACC文法以外のルビーの文法。)TreeTopの著者が数年間1つに取り組んでいることを知っていますが、それは些細なことではありません。 Xruby Rightで使用されているANTLR文法を取得するには、約5年かかりましたが、まだ完全に準拠していません。

Rubyの構文はです めちゃくちゃ, 、気まぐれに複雑です。

他のヒント

いいえ


私はそうは思わない。 TreeTopで複雑で微妙なRuby文法を指定することは大きな成果ですが、それは可能です。

実際のルビーグラマーはYACCで書かれています。現在、YACCは伝説的なツールですが、TreeTopはより強力なクラスのパーサーを生成しているため、可能であり、おそらく誰かがそれを行ったはずです。

午後のプロジェクトではありません。

冗談かもしれませんが、YACCがRubyよりも複雑ではない場合、YACCのために作成されたRuby文法を使用するよりも、ツリートップでYACCを実現できます。

あなたの目的のために、あなたはおそらくルビーをすべて解析せずに逃げることができます。実際に必要なのは、ルビーブロックを閉じる%>を検出する方法です。 Rubyコードにそれらの閉じた文字が含まれている場合に失敗したくない場合は、Rubyテキスト内でそれらの文字が発生する可能性のある場所を検出する必要があります。つまり、あらゆる形態のリテラルを検出する必要があります。

ただし、あなたはおそらく、Rubyテキストで%>が発生する可能性の高いケースを認識し、それらのケースだけを無視する可能性が高い場合に逃げることができます。これは、もちろん、ユーザーにERBを少し異なる方法で書き込むことにより、残りの障害を処理できることを前提としています。

それが価値があることについては、Tretop自体がこの方法でRubyブロックを「解析」します。閉じた文字が見つかるまで{および}文字をカウントするだけです。したがって、ブロックに文字通りの文字列にa}が含まれている場合、あなたは壊れています(ただし、コメントに一致するものを含めることで回避できます)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top