9

Treetopを使用して ERB ファイルを解析しようとしています。次のような行を処理できる必要があります。

<% ruby_code_here %>
<%= other_ruby_code %>

Treetop は Ruby で書かれていて、あなたは Ruby で Treetop の文法を書いていますが、Treetop には、別のルールを書き出さなくても「ここで Ruby コードを探して、その内訳を教えてください」と言う既存の方法が既にありますか? Ruby 言語のすべての部分? .treetop文法ファイルで、次のような方法を探しています。

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

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

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

編集:そうですね、気のめいるようですが、情報をありがとう。:) 私の修士プロジェクトでは、ERB を入力として使用する必要があるテスト ケース ジェネレーターを作成しています。さいわい、私の目的のためには、ifステートメントやその他の条件文、ループなど、ERB コード内のいくつかのことを認識する必要があるだけです。それと一致する Treetop 文法を考え出すことができると思いますが、Ruby では完全ではないことに注意してください。

4

4 に答える 4

11

私の知る限り、Ruby の Treetop 文法を作成した人はまだ誰もいません。(実際、 MRI と YARV に同梱されている YACC 文法以外に、Ruby 用の文法を作成できた人は誰もいません。) Treetop の作成者が数年前から 1 つに取り組んでいることは知っていますが、それは簡単な仕事ではありませ。. XRuby で使用されている ANTLR 文法を正しく理解するのに約 5 年かかりましたが、まだ完全には準拠していません。

Ruby の構文は気が遠くなるほど複雑です。

于 2010-10-29T20:41:44.200 に答える
2

いいえ


私はそうは思わない。ツリートップで複雑で微妙な Ruby 文法を指定することは大きな成果ですが、可能になるはずです。

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

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

于 2010-10-29T18:43:47.593 に答える
1

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

于 2010-10-31T18:06:18.953 に答える
0

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

ただし、目的のためには、Ruby テキストで %> が発生する可能性が最も高いケースを認識して、それらのケースだけを無視することができます。これはもちろん、ユーザーに ERB を少し異なる方法で記述させることで、残りの障害を処理できることを前提としています。

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

于 2015-05-06T02:50:53.297 に答える