%%
s: first '%%' second
;
first:
A first
| A
;
second:
A second
| A
;
%%
sub Lexer1 {
my($parser)=shift;
print "In Lexer 1 \n";
for (${$parser->YYInput}) {
m/\G\s*/gc;
m/\G(%%)/gc and do {
$parser->YYLexer(\&Lexer2);
return ($1, undef);
};
m/\G(.)/gcs and return($1,$1);
return('', undef);
}
}
sub Lexer2 {
my($parser)=shift;
print "In Lexer 2 \n";
for (${$parser->YYInput}) {
m/\G\s*/gc;
m/\GB/gc and return('A','B');
m/\G(.)/gcs and die "Error. Expected 'B', found $1\n";
}
return('', undef);
}
__PACKAGE__->lexer(\&Lexer1);