以下のコードに示すように、名前を参照するときに「サブルーチンで深い再帰」警告が表示されます。 use 5.016 … __SUB__
->()も役に立ちません。Hammerパーサーコンビネータでは、それ自体を参照するルールをどのように実装しますか?
ビルドヒント:git clone; scons bindings = perlテスト。 cdビルド/ opt/src/bindings/perl; mproduct
はunconditonally mproduct
を呼び出します。$ EDITORのh.pl
use 5.024;
use strictures;
use blib;
use hammer qw();
# digits = "0"/"1"/"2"/"3"/"4"/"5"/"6"/"7"/"8"/"9"
sub digits { hammer::many hammer::in 0..9 }
# product = digits "*" digits
sub product {
hammer::sequence digits, hammer::ch('*'), digits
}
product->parse('23*42'); # [[2, 3], '*', [4, 2]]
# mproduct = digits "*" mproduct
sub mproduct;
sub mproduct {
hammer::sequence digits, hammer::ch('*'), mproduct
}
mproduct->parse('8*23*42');
# Deep recursion on subroutine "main::mproduct" at h.pl line 21.
[hammer](https://github.com/abiggerhammer/hammer)が再帰的降下パーサーである場合、自己参照ルールは許可されていませんか? – jeff6times7
あなたはどのようにそれがrec.descentだと思いますか? – daxim
できるだけ多くのdocs/hammer-presentation.pdfとソースの一部を読みました。私は何かを誤解しましたか?私はそのコードに慣れていないので、私はより速いパーサを見つけることに興味があります。あなたの質問は私の興味をそそりました。 – jeff6times7