%initstate 3 %white [\ \t]+ %comments ##.+ %% STATE:3{ ### Block level \n*#((?i)let:?)\s* { BEGIN 0; return("LET",$1); } \n*#((?i)format:?)\s* { BEGIN 5; return("FORMAT", $1); } \n*#((?i)verification:?)[\ \t]* { BEGIN 4; return("VERIFY", $1); } \n*#(?i)verifyfunctions:?((.|\n)+?)((?=\n*#\w+:?)|(?=__EOF__)) { return("VF_FUNCTION", $1);} \n*#(?i)perl:?((.|\n)+?)(?=__EOF__) { return("PERL",$1); } \n*#(?i)tab[\ \t]+(\S+) { return("TAB",$1); } \n*#(\w+):? { return("BLOCKID",lc($1)); } ((.|\n)+?)(?=\n#\w) { return("TEXBLOCK",__remsp($1)); } ((.|\n)+?)(?=__EOF__) { return("TEXBLOCK",__remsp($1)); } } STATE:4{ ### verify block (perl|maxima)($__CBB) { return("extblock", block_value($1,$+{CBB })); } ;?\s*\n+(?=#\w+:?) { BEGIN 3; return ("LB", "");} #([\w]+)\[(\d+)\] { return("IDs",{id=>$1,n=>$2 }); } #([\w\-]+) { return("ID",$1); } \{($__CBB)\} { BEGIN 0; return("V",["EXP", $+{CBB } ]); } (\w+)\s*=\s*(\S.*?)\s*(?=(;|\w+\s*=)) { return("ATVAL",{id=>$1,v=>$2});} ;\s* { return("LB",""); } \n\s*\n { return("LB",""); } \s*\n { return("LB",""); } } STATE:0{ ### let lhs (perl|maxima)($__CBB) { BEGIN 0; return("extblock", block_value($1,$+{CBB })); } ([\w]+)\[(\d+)\] { return("IDs",{id=>$1,n=>$2 }); } ([\w\-]+) { return("ID",$1); } (=) { BEGIN 1; return($1,$1); } (\~) { return($1,$1); } \n\s*\n { return("LB",""); } ;\s*\n { return("LB",""); } \n(?=\S) { return("LB",""); } \n*(?=#\w+:?) { BEGIN 3; return ("LB", "");} } STATE:1{ ### let rhs \n\s*\n { BEGIN 0; return("LB",""); } ;\s*\n { BEGIN 0; return("LB",""); } \n(?=\S) { BEGIN 0; return("LB",""); } (\w+)$__PB { BEGIN 0; return("V",["FUN",$1,__remsp($+{PB })]); } \{($__CBB)\} { BEGIN 0; return("V",["EXP", $+{CBB } ]); } ($__CBB) { BEGIN 0; return("V",perl_value($+{CBB }) ); } ($__BB) { BEGIN 0; return("V",["BB", __bl_csv($1)]); } (perl|maxima)($__CBB) { BEGIN 0; return("extblock", block_value($1,$+{CBB })); } (\S[^;\n]*) { BEGIN 0; return("V",["EXP",__remsp($1)]); } } STATE:5{ ## block FORMAT (latex prep proc) (\S.*?)\s*=e=(.*)\s* { return("PAIR", {op=>"e",lhs=>$1,rhs=>$2 }); } (\S.*?)\s*=(.*)\s* { return("PAIR", {lhs=>$1,rhs=>$2 }); } \s*#(\w+):? { BEGIN 3; return("BLOCKID",lc($1)); } } %% sub perl_value{ my $a = shift; if($a =~ m/#(\w+)/){ return ["LAMBDA",$a] } else { return ["CBB",$a] } } sub block_value{ my ($bid,$a) = @_; if($a =~ m/#(\w+)/){ return {type=>$bid, v=>["LAMBDA",$a]} } else { return {type=>$bid, v=>["CBB",$a]} } }