$_[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