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,