17

Ruby の Treetop 文法ジェネレーターを独学で学ぼうとしています。私は、ドキュメントが「最高」のものに対してひどくまばらであるだけでなく、私が望んでいたほど直感的に機能していないように見えることを発見しています.

大まかに言えば、オンサイトのドキュメントやビデオよりも優れたチュートリアルがあれば、それがあれば本当にうれしいです。

より低いレベルでは、これは私がまったく働けない文法です:

grammar SimpleTest

  rule num
    (float / integer)
  end

  rule float
   (
    (( '+' / '-')? plain_digits '.' plain_digits) /
    (( '+' / '-')? plain_digits ('E' / 'e') plain_digits ) /
    (( '+' / '-')? plain_digits '.') / 
    (( '+' / '-')? '.' plain_digits) 
   ) {
      def eval
        text_value.to_f
      end
   }
  end

  rule integer
    (( '+' / '-' )? plain_digits) {
      def eval
        text_value.to_i
      end
    }
  end

  rule plain_digits
    [0-9] [0-9]*      
  end

end

それを読み込んで、非常に単純なテスト オブジェクトでいくつかのアサーションを実行すると、次のことがわかります。

assert_equal @parser.parse('3.14').eval,3.14

正常に動作しますが、

assert_equal @parser.parse('3').eval,3

エラーが発生します: NoMethodError: プライベート メソッド `eval' が呼び出されました #

説明で整数と浮動小数点数を逆にすると、整数と浮動小数点数の両方でこのエラーが発生します。これは限られた先読みに関連している可能性があると思いますが、「または」コンテキストで評価するという考えをカバーする情報さえ、どのドキュメントにも見つかりません

役立つかもしれないもう少しの情報。これら両方の parse() ブロックの pp 情報は次のとおりです。

フロート:

SyntaxNode+Float4+Float0 offset=0, "3.14" (eval,plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""
  SyntaxNode offset=1, "."
  SyntaxNode+PlainDigits0 offset=2, "14":
    SyntaxNode offset=2, "1"
    SyntaxNode offset=3, "4":
      SyntaxNode offset=3, "4"

整数...整数規則に従うように定義されているように見えますが、 eval() メソッドをキャッチしていないことに注意してください。

SyntaxNode+Integer0 offset=0, "3" (plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""

アップデート:

私は特定の問題を解決しましたが、その理由はわかりません:

  rule integer
    ( '+' / '-' )? plain_digits
     {
      def eval
        text_value.to_i
      end
    }
  end

これは、存在するドキュメントでは意味がありませんが、余分な括弧を削除するだけで、Integer1 クラスと Integer0 クラスが一致しました。Integer1 は明らかに eval() メソッドを保持するクラスです。なぜそうなのか、私にはわかりません。

私はまだツリートップについてのより多くの情報を探しています.

4

8 に答える 8

17

Treetop の開始に関する Paul Battley の素敵で簡単なチュートリアルをお勧めします。

最小限の文法から始めて、パーサーを作成する方法を示してから、数回の反復を経て、ほんの少しの機能を追加します。スターティングブロックから抜け出すにはそれで十分でした。

于 2009-12-30T04:01:33.460 に答える
10

悲しいことに、Treetop のドキュメントは最低です。多くの。また、ウェブサイトの例は役に立ちません。私は、dzone がツリートップ文法のかなり大きなコレクションを持っていることを発見しました:

ツリートップ文法

于 2009-02-10T16:00:38.377 に答える
3

Roland Swingler は LRUG に Treetop に関するプレゼンテーションを行いまし

于 2010-03-22T08:38:54.377 に答える
3

Citrus は、treetop のはるかに軽量な代替手段です: http://github.com/mjijackson/citrus

于 2010-07-07T13:57:15.530 に答える
2

私は数年前にこのTreetop 入門チュートリアルに従って、treetop の基本を理解しました。

そして、Treetop でパーサーを書くための簡単な紹介 、構文ツリーノードをルビークラスインスタンスにマップする方法を説明したので、私にとって役に立ちました。

于 2013-09-06T16:36:26.213 に答える
1

これはバグです。整数のルールを囲む不要な括弧により、eval の定義を含む余分なモジュールが作成されます。このモジュールはノードに混在しないため、「eval」は使用できません。これらの余分な括弧があるバージョンとないバージョンの Ruby コード (tt コマンドを使用して生成された) を比較すると、これが明確にわかります。

于 2014-11-18T23:22:00.390 に答える
1

TreeTop の実験を始めたところです。

着替えてみました

 rule num
      (float / integer)
 end

 rule num
      (float / integer)
      {
       def eval
            text_value.to_f
       end
      }
 end

そしてそれはうまくいくようです。

于 2009-09-11T17:16:27.673 に答える
0

Treetopのドキュメントは、式文法(PEG)の解析についてすでにかなりの量を知っていることを前提としているようです。Treetopは完全にPEGに基づいています。ただし、PEGはTreetopよりも大きいため、他の解析ライブラリでも使用されます。Treetopを学ぶ上で、一般的にPEGについて学ぶことは非常に役に立ちました。これは、ドキュメントの多くのギャップを埋めるのに役立ちました。

于 2012-10-26T04:30:05.527 に答える