#!/usr/bin/perl use warnings; my %action_list = (); my %rules = ( Cmd_SetVariable => qw' ^\s*(\w+)+\s*\=\s*(\w+)\s*$ ', Cmd_IfThen => qw' ^\s*if\s*\(\s*(\w+)\s*(>=?|<=?|==)\s*(\w+)\s*\)\s*\{\s*([\w\s\(\)=]+)\;?\s*\}$ ', Cmd_Chunk => qw' ^\s*\w+\s*$ ', Cmd_MultiChunk => qw' ^\s*(.*?\;){0,}\s*$ ', ); sub AUTOLOAD { my $func = shift; print "Oops, handler not defined : $func\n"; } sub Cmd_SetVariable { print "Its a Set Variable Chunk\n"; } sub Cmd_IfThen { my ($this, $chunk) = @_; print "Its a If then Chunk\n"; my ($arg1, $op, $arg2, $do) = $chunk =~ /$rules{Cmd_IfThen}/; print "arg1: $arg1 op: $op arg2: $arg2 do: $do\n"; CheckChunk($do); } sub Cmd_MultiChunk { my ($this, $chunk) = @_; print "Its a Multi Chunk\n"; my @chunks = split ';',$chunk; foreach $c ( @chunks ) { CheckChunk($c); } } sub ViewList { print "\nActionList\n"; foreach my $key ( sort keys %action_list ) { my @commands = split ';', $action_list{$key}; print "$key:"; foreach my $v ( @commands ) { print "\t$v\n"; } } print "\n\n"; } sub AddAction { my $arg = shift; my ($action_name, $action) = split ':', $arg; $action_list{$action_name} = $action; } sub CheckChunk { my $command = shift; my $translated; print "\nProcessing : $command\n"; $translated = 0; foreach my $rulename ( keys %rules ) { if ( $command =~ /$rules{$rulename}/ ) { print "Gotcha :$rules{$rulename}\n"; &{$rulename}($rulename, $command); $translated = 1; } } if ( $translated != 1 ) { print "Syntax Error : $command\n"; } } sub CheckActions { foreach my $name ( sort keys %action_list ) { CheckChunk($action_list{$name}); } } AddAction("test: a=4;b =5 ; c = 9;if (b > a) { c = 100 };"); #AddAction("Camel: Camel = 5"); #AddAction("hippo: ilovetoswim"); #AddAction("ifthen1: if ( ABC > 500 ){XYZ = 10}"); #AddAction("ifthen2: if ( ABC < 500 ){sdfsdf}"); #AddAction("ifthen3: if ( ABC = 500 ){sdfsdf}"); #AddAction("ifthen4: if ( ABC == 500 ){sdfsdf}"); #AddAction("ifthen5: if ( ABC << 500 ){sdfsdf}"); #supposed to break #AddAction("ifthen6: if ( ABC >> 500 ){sdfsdf}"); #supposed to break #AddAction("ifthen7: if ( ABC <= 500 ){sdfsdf}"); #AddAction("ifthen8: if ( ABC >= 500 ){sdfsdf}"); ViewList(); CheckActions(); #### ActionList hippo: a=4 b =5 c = 9 if (b > a) { c = 100 } Processing : a=4;b =5 ; c = 9;if (b > a) { c = 100 }; Gotcha :^\s*(.*?\;){0,}\s*$ Its a Multi Chunk Processing : a=4 Gotcha :^\s*(\w+)+\s*\=\s*(\w+)\s*$ Its a Set Variable Chunk Processing : b =5 Gotcha :^\s*(\w+)+\s*\=\s*(\w+)\s*$ Its a Set Variable Chunk Processing : c = 9 Gotcha :^\s*(\w+)+\s*\=\s*(\w+)\s*$ Its a Set Variable Chunk Processing : if (b > a) { c = 100 } Gotcha :^\s*if\s*\(\s*(\w+)\s*(>=?|<=?|==)\s*(\w+)\s*\)\s*\{\s*([\w\s\(\)=]+)\;?\s*\}$ Its a If then Chunk arg1: b op: > arg2: a do: c = 100 Processing : c = 100 Gotcha :^\s*(\w+)+\s*\=\s*(\w+)\s*$ Its a Set Variable Chunk