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() メソッドを保持するクラスです。なぜそうなのか、私にはわかりません。
私はまだツリートップについてのより多くの情報を探しています.