sub demacro($) { my $text = shift; while (($macro,$pkg) = each %macro ) { my $defn = $$pkg[0]; if (defined $$pkg[1]) { my @args = @{$$pkg[1]}; while ($text =~ m/($macro\((.*?)\))/g) { my $oA = length($`), $oZ = length($&); my @vals = split /\s*,\s*/, $2; (@args eq @vals) or die "Bad arg count for macro '$macro'\n"; my $_defn = $defn; for ($i=0; $i<@args; $i++) { $_defn =~ s/$args[$i]/($vals[$i])/g; } substr($text, $oA, $oZ) = $_defn; } } else { $text =~ s/$macro/$defn/; } } return $text; } #### macrodef : '#define' /[a-z]\w*/i '(' ')' /.*/ { $::macro{$item[2]} = [ $item[-1], $item[4] ]; } | '#define' /[a-z]\w*/i /.*/ { $::macro{$item[2]} = [ $item[-1] ]; } #### #define add(a,b,c) (a+b+c) #define mult(d,e) (d*e) #define pi (3.1415) main( ) { add(1,2,3); mult(4,5); float p = pi; }