を支援ロジックを分離する。基本的に文法以外のマルチメソッドと同じ考えです。
(I Code Golfへの回答を評価するためのwrote this)
grammar Mathemania {
token TOP { <cmd-list> }
token cmd-list { <cmd>+ }
token cmd { <op> <argument>? }
proto token op { * }
token op:sym<exp> { e } # notice that the name doesn't have to match
token op:sym<factorial> { f }
token op:sym<root> { r }
token op:sym<ceil> { c }
token op:sym<floor> { l }
token argument { '(' ~ ')' <cmd-list> }
}
class Calculate {
method TOP ($/) { make $<cmd-list>.made }
method argument ($/) { make $<cmd-list>.made }
method cmd-list ($/) {
my $result = 2;
$result = .made.($result).narrow for @<cmd>;
make $result;
}
method cmd ($/) {
if $<argument> {
make $<op>.made.assuming(*, $<argument>.made);
} else {
make $<op>.made;
}
}
method op:sym<exp> ($/) { make -> \n, \e = 2 { n ** e } }
method op:sym<factorial> ($/) { make -> \n, \k = 2 { [*] n, n - k + 1 ...^ 0 } }
method op:sym<root> ($/) { make -> \n, \r = 2 { n ** (1/r) } }
method op:sym<ceil> ($/) { make &ceiling }
method op:sym<floor> ($/) { make &floor }
}
サブクラス化文法が既に存在するものの側面に沿ってそのトークンを追加できるようにそれはまたそれを行い、サブクラスのアクションクラスを行うことができます同じ。プロトとのマルチにあなたの選択肢を分割する(try it)
grammar Mathmania-Plus is Mathemania {
token op:sym<negate> { n }
token op:sym<abs> { a }
}
class Calculate-Plus is Calculate {
method op:sym<negate> ($/) { make &prefix:<-> }
method op:sym<abs> ($/) { make &abs }
}
ああ、大丈夫です。しかし、なぜアクションクラスの 'sigil'メソッドが呼び出されなかったのでしょうか?私は文法の外でこれを使うことができますが、私は文法の中でその事例を考えようとしています。私が見た例は複雑ではありませんでした、または彼らはカーゴカルトでした。 –