質問
私は、Rubyの梢文法ジェネレータ自分自身を教えしようとしています。私だけではないが、そこに「最良の」いずれかのはなはだまばらなドキュメントですが、のように直感的に、私は期待したいように動作するようには思えないということを発見しています。
1がある場合にハイレベルで、私は本当に、オンサイトのドキュメントやビデオよりも優れたチュートリアルを愛するかもます。
低いレベルでは、ここで私はすべてで動作させることはできません文法があります:
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を」 私が説明に整数および浮動小数点数を逆にした場合、、整数と浮動小数点数の両方が私にこのエラーを与えます。私は、これは限られた先読みに関係することができると思うが、私もで評価の考え方をカバーするためにドキュメントのいずれかの任意の情報を見つけることができません「または」コンテキスト
役立つかもしれない、もう少し情報。ここでは、これらの解析の両方のための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
これが存在しているドキュメントでは意味がありませんが、ちょうど試合をした余分な括弧は整数1クラスだけでなく、Integer0が含ま取り除きます。整数1は明らかにeval()メソッドを保持するクラスです。私はこれが事実である理由はわかりません。
私はまだ梢についての詳細情報を探しています。
解決
悲しいことに、樹上のドキュメントは吸います。たくさん。そして、ウェブサイト上の例は有用ではありません。私はdzoneが梢文法のかなり大規模なコレクションを持っていることが判明します:
梢は文法の
他のヒント
あなたはでポールBattleyの素敵な、簡単なチュートリアルを認めるかもしれません 梢の入門
最小限の文法から始めて、彼はパーサを作成する方法を示し、その後の反復のカップルを通じて機能のほんの少しを追加します。開始ブロックの外に私を取得するだけで十分だった。
ローランドSwinglerはLRUGに梢上のプレゼンテーションを行いました: http://skillsmatter.com/podcast/ajax-ria/treetopする 私が始める有用であることが分かっている。
私はこの梢入門を追いましたチュートリアルは梢の基本を理解するために数年前します。
そして迅速なイントロへそれは、クラスのインスタンスをルビーする構文木のノードをマッピングする方法を説明しているため梢に、私には便利でパーサを書いています。
私はちょうどツリートップの実験を始めました。
私は
変更を試してみました rule num
(float / integer)
end
タグに
rule num
(float / integer)
{
def eval
text_value.to_f
end
}
end
そして、動作しているようです。
樹上のドキュメントでは、すでにの(PEG類)の発現の文法を解析するについてのかなりの量を知っていると仮定しているようです。梢は完全PEG類に基づいています。 PEGは、すなわち、それらは、他の解析ライブラリで使用されている、ちょうどしかし梢よりも大きくなっています。梢を学んで、私は一般的に、PEGの上に勉強することは非常に役に立ちました。これは、ドキュメントのギャップの多くを埋める助けます。
これはバグです。整数のためのルールの周りの不要な括弧はevalの定義を格納するための追加のモジュールの構造を引き起こし、このモジュールは、ノードに混入していないので、「evalは」利用できません。あなたはRubyのコードを比較する場合は、これらの余分な括弧付きとなしのバージョンの(TTコマンドを使用して生成された)これを明確に見ることができます。