sub argout {
my $temp = {'type'=>'ARG',
'value'=>$buffer};
$buffer = '';
push(@output,$temp);
}
sub otherout {
my $c = shift;
my $temp = {'type'=>'OTHER',
'value'=>$c};
push(@output,$temp);
}
%states = (
'start'=>{'s'=>{'nextstate'=>'var1.1'}},
'var1.1'=>{'i'=>{'nextstate'=>'var1.2'}},
'var1.2'=>{'s'=>{'action'=>'argout',
'nextstate'=>'var1.1'},
'eof'=>{'action'=>'argout'}}
);
sub lex {
my $inputstring = shift;
my @input = split('',$inputstring);
my @output = ();
$buffer = '';
my $s = 'start';
foreach my $c (@input,'eof') {
if( my $t = $states{$s}->{$c} ) {
eval( $t->{'action'} );
$s = $t->{'nextstate'};
}
else {
otherout($c);
return 0;
}
$buffer = $buffer.$c;
}
return 1;
}
if( lex('sisisi') ) {
print("success!\n");
}
else {print("failure...")}
foreach my $tok (@output) {
print("$tok->{'type'},$tok->{'value'}\n");
}
####
success!
ARG,si
ARG,si
ARG,si
####
success!
ARG,
ARG,
ARG,