Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: Parser.pm
- ===================================================================
- --- Parser.pm (revision 8956)
- +++ Parser.pm (working copy)
- @@ -6,8 +6,7 @@
- require Exporter;
- our @ISA = qw(Exporter);
- -our @EXPORT = qw(parseMacroFile parseCmd isNewCommandBlock);
- -our @EKSPORT_OK = qw(parseCmd isNewCommandBlock);
- +our @EXPORT = qw(parseMacroFile parseCmd isNewCommandBlock setVariable);
- use Globals;
- use Utils qw/existsInList/;
- @@ -45,19 +44,40 @@
- s/\s*[\r\n]?$//g; # remove trailing whitespaces and eol
- s/ +/ /g; # trim down spaces - very cool for user's string data?
- next unless ($_);
- -
- - if (!%block && /{$/) {
- - my ($key, $value) = $_ =~ /^(.*?)\s+(.*?)\s*{$/;
- - if ($key eq 'macro') {
- - %block = (name => $value, type => "macro");
- - $macro{$value} = []
- - } elsif ($key eq 'automacro') {
- - %block = (name => $value, type => "auto")
- - } elsif ($key eq 'sub') {
- - %block = (name => $value, type => "sub")
- - } else {
- - %block = (type => "bogus");
- - warning "$file: ignoring line '$_' in line $. (munch, munch, strange block)\n"
- +
- + if (!%block) {
- + if (/{$/) {
- + my ($key, $value) = $_ =~ /^(.*?)\s+(.*?)\s*{$/;
- + if ($key eq 'macro') {
- + %block = (name => $value, type => "macro");
- + $macro{$value} = []
- + } elsif ($key eq 'automacro') {
- + %block = (name => $value, type => "auto")
- + } elsif ($key eq 'sub') {
- + %block = (name => $value, type => "sub")
- + } else {
- + %block = (type => "bogus");
- + warning "$file: ignoring line '$_' in line $. (munch, munch, strange block)\n"
- + }
- + } elsif (/^\$[a-z]/i) {
- + my ($var, $val);
- + if (($var, $val) = $_ =~ /^\$([a-z][a-z\d]*?)\s+=\s+(.*)/i) {
- + my $placeError; # gambiarra para substituir o self, que armazena algo caso tenha erro
- + setVariable($var, $val, $placeError, "error in $.");
- + if (defined $placeError->{error}) {return warning $placeError->{error}}
- + }
- + } elsif (/^\$\{\$[.a-z]/i) {
- + my ($dvar, $val);
- + if (($dvar, $val) = $_ =~ /^\$\{\$([.a-z][a-z\d]*?)\}\s+=\s+(.*)/i) {
- + my $var = $varStack{$dvar};
- + unless (defined $var) {warning "$file: ignoring '$_' in line $. (munch, munch, $dvar not defined)\n"}
- + else {
- + my $placeError; # gambiarra para substituir o self, que armazena algo caso tenha erro
- + setVariable("#$var", $val, $placeError, "error in $.");
- + if (defined $placeError->{error}) {return warning $placeError->{error}}
- + # TODO: Falta ajeitar o tratamento de erro
- + }
- + }
- }
- next
- }
- @@ -373,4 +393,17 @@
- }
- }
- +# TODO: Coloco aqui ou no Script.pm?
- +sub setVariable {
- + my ($var, $val, $self, $errtpl) = @_;
- +
- + my $pval = parseCmd($val, $self);
- + if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
- + if (defined $pval) {
- + if ($pval =~ /^\s*(?:undef|unset)\s*$/i && exists $varStack{$var}) {undef $varStack{$var}}
- + else {$varStack{$var} = $pval}
- + }
- + else {$self->{error} = "$errtpl: $val failed"}
- +}
- +
- 1;
- Index: Script.pm
- ===================================================================
- --- Script.pm (revision 8956)
- +++ Script.pm (working copy)
- @@ -10,7 +10,7 @@
- use Globals;
- use AI;
- use Macro::Data;
- -use Macro::Parser qw(parseCmd isNewCommandBlock);
- +use Macro::Parser qw(parseCmd isNewCommandBlock setVariable);
- use Macro::Utilities qw(cmpr);
- use Macro::Automacro qw(releaseAM lockAM);
- use Log qw(message warning);
- @@ -44,7 +44,9 @@
- error => undef,
- orphan => $::config{macro_orphans},
- interruptible => 1,
- - macro_block => 0
- + macro_block => 0,
- + countCurrentBlock => 0,
- + listLocalVarStack => ()
- };
- if (defined $lastname && defined $lastline) {
- @@ -219,6 +221,13 @@
- my $errtpl = "error in ".$self->{line};
- + #print("--------------------\n");
- + #print($line . "\n");
- + #print("countCurrentBlock: " . $self->{countCurrentBlock} . "\n");
- + #if ($self->{listLocalVarStack}[$self->{countCurrentBlock}]) {
- + # print("listLocalVarStack: " . join(", ", @{$self->{listLocalVarStack}[$self->{countCurrentBlock}]}) . "\n");
- + #}
- +
- # "If" postfix control
- if ($line =~ /.+\s+if\s*\(.*\)$/) {
- my ($text) = $line =~ /.+\s+if\s*\(\s*(.*)\s*\)$/;
- @@ -289,6 +298,7 @@
- if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
- $savetxt = particle($text, $self, $errtpl);
- if (multi($savetxt, $self, $errtpl)) {
- + $self->{countCurrentBlock}++;
- $countBlockIf--;
- }
- }
- @@ -364,6 +374,12 @@
- ##########################################
- # end block of "if" or "switch"
- } elsif ($line eq '}') {
- + if ($self->{listLocalVarStack}[$self->{countCurrentBlock}]) {
- + foreach (@{$self->{listLocalVarStack}[$self->{countCurrentBlock}]}) {
- + delete $varStack{$_};
- + }
- + }
- + $self->{countCurrentBlock}--;
- $self->{line}++;
- $self->{timeout} = 0
- @@ -399,24 +415,27 @@
- return $self->{result} if $self->{result}
- ##########################################
- # set variable: $variable = value
- - } elsif ($line =~ /^\$[a-z]/i) {
- - my ($var, $val);
- + } elsif ($line =~ /^(?:local\s+)?\$[a-z]/i) {
- + my ($isLocal, $var, $val);
- if ($line =~ /;/) {run_sublines($line, $self); if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}}
- else {
- - if (($var, $val) = $line =~ /^\$([a-z][a-z\d]*?)\s+=\s+(.*)/i) {
- - my $pval = parseCmd($val, $self);
- - if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
- - if (defined $pval) {
- - if ($pval =~ /^\s*(?:undef|unset)\s*$/i && exists $varStack{$var}) {undef $varStack{$var}}
- - else {$varStack{$var} = $pval}
- - }
- - else {$self->{error} = "$errtpl: $val failed"}
- + $line =~ /^(local\s+)?\$(.*)$/i;
- + if ($1) {
- + $isLocal = 1;
- + } else {
- + $isLocal = 0;
- }
- - elsif (($var, $val) = $line =~ /^\$([a-z][a-z\d]*?)([+-]{2})$/i) {
- + if (($var, $val) = $2 =~ /^([a-z][a-z\d]*?)\s+=\s+(.*)/i) {
- + setVariable($var, $val, $self, $errtpl);
- + }
- + elsif (($var, $val) = $2 =~ /^([a-z][a-z\d]*?)([+-]{2})$/i) {
- if ($val eq '++') {$varStack{$var} = ($varStack{$var} or 0)+1}
- else {$varStack{$var} = ($varStack{$var} or 0)-1}
- }
- else {$self->{error} = "$errtpl: unrecognized assignment"}
- + if ($isLocal) {
- + push(@{$self->{listLocalVarStack}[$self->{countCurrentBlock}]}, $var);
- + }
- }
- $self->{line}++;
- $self->{timeout} = 0 unless defined $self->{mainline_delay} && defined $self->{subline_delay};
- @@ -431,13 +450,7 @@
- my $var = $varStack{$dvar};
- unless (defined $var) {$self->{error} = "$errtpl: $dvar not defined"}
- else {
- - my $pval = parseCmd($val, $self);
- - if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
- - unless (defined $pval) {$self->{error} = "$errtpl: $val failed"}
- - else {
- - if ($pval =~ /^\s*(?:undef|unset)\s*$/i) {undef $varStack{"#$var"}}
- - else {$varStack{"#$var"} = $pval}
- - }
- + setVariable("#$var", $val, $self, $errtpl);
- }
- }
- elsif (($dvar, $val) = $line =~ /^\$\{\$([.a-z][a-z\d]*?)\}([+-]{2})$/i) {
- @@ -834,6 +847,9 @@
- $self->{timeout} = $self->{macro_delay}
- }
- }
- + elsif ($then =~ /^{$/) {
- + $self->{countCurrentBlock}++;
- + }
- elsif ($then eq "stop") {$self->{finished} = 1}
- }
- Index: Utilities.pm
- ===================================================================
- --- Utilities.pm (revision 8956)
- +++ Utilities.pm (working copy)
- @@ -477,7 +477,17 @@
- }
- }
- $queue->ok;
- - if (defined $queue && $queue->finished) {undef $queue}
- + if (defined $queue && $queue->finished) {
- + while ($queue->{countCurrentBlock} >= 0) {
- + if ($queue->{listLocalVarStack}[$queue->{countCurrentBlock}]) {
- + foreach (@{$queue->{listLocalVarStack}[$queue->{countCurrentBlock}]}) {
- + delete $varStack{$_};
- + }
- + }
- + $queue->{countCurrentBlock}--;
- + }
- + undef $queue
- + }
- } else {
- my $name = (defined $queue->{subcall}) ? $queue->{subcall}->name : $queue->name;
- my $error = $queue->error;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement