在Marpa::R2的cpan页面中,我了解 BNF(Backus-Naur 形式),但我对动作回调非常迷茫。
在下面的这个例子中,我知道左右两个成员被传递给do_multiply
. 对于那件事我没有任何疑问。问题是我找不到任何关于这些论点的文档?
my $dsl = <<'END_OF_DSL';
:default ::= action => [name,values]
lexeme default = latm => 1
Calculator ::= Expression action => ::first
...
Term '*' Factor action => do_multiply
...
END_OF_DSL
my $grammar = Marpa::R2::Scanless::G->new( { source => \$dsl } );
sub do_multiply { $_[1] * $_[2] }
$_[0]
甚至是什么$_[3]
?这是在哪里记录的?即使在官方 marpa 网站上,我也看不到任何文档。
在另一个示例中,这里是chobora的答案,我们看到它pair
指的是$_[2]
and $_[3]
:
BNF 的片段:
Hash ::= '(' Pairs ')' action => hash
Pairs ::= Pair+ action => pairs
Pair ::= '(' Key Value ')' action => pair
Key ::= String
核心代码:
$recce->read(\$input);
print Dumper $recce->value;
sub hash { $_[2] }
sub pairs { shift; +{ map @$_, @_ } }
sub pair { [ @_[2, 3] ] } # What is 2 and 3?
sub itself { $_[1] }