$_[0]->YYSemval( index )
- index が 1 以上の場合は $_[n] と同じ
- index が 0 以下の場合は $-n と同じようなもの。$_[0], $_[-n] とは書けない
ということらしいが、どういう状況で使うのかは不明。
yacc で $-n と書けることさえ知らなかったし。
0 以上の場合を確認
%% input: #empty | input line ; line: '\n' { $_[1] } | 'a' 'b' 'c' '\n' { print $_[0]->YYSemval(0), "|", $_[0]->YYSemval(1), "|", $_[0]->YYSemval(2), "|", $_[0]->YYSemval(3), "\n"; } | error '\n' { $_[0]->YYErrok } ; %% sub _Error { exists $_[0]->YYData->{ERRMSG} and do { print $_[0]->YYData->{ERRMSG}; delete $_[0]->YYData->{ERRMSG}; return; }; print "Syntax error.\n"; } sub _Lexer { my($parser)=shift; $parser->YYData->{INPUT} or $parser->YYData->{INPUT} = <STDIN> or return('',undef); $parser->YYData->{INPUT}=~s/^[ \t]//; for ($parser->YYData->{INPUT}) { s/^(.)//s and return($1,$1); } } sub Run { my($self)=shift; $self->YYParse( yylex => \&_Lexer, yyerror => \&_Error ); } my($t)=new Test; $t->Run;
で、
|a|b|c