diff options
| author | Drahflow <drahflow@gmx.de> | 2012-12-30 14:39:45 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2012-12-30 14:39:45 +0100 |
| commit | 047fb919e7a08c7daa5ec4581fc5ab8cf5f25a6f (patch) | |
| tree | 9e9fac15c1e2c0714467048ae52a90344b9f4522 /interpreter | |
| parent | d74d19aee738ba60f584899e9530e9aa98845be2 (diff) | |
-, _, * now normal functions
Diffstat (limited to 'interpreter')
| -rw-r--r-- | interpreter/Elymas.pm | 57 | ||||
| -rw-r--r-- | interpreter/ElymasGlobal.pm | 39 |
2 files changed, 41 insertions, 55 deletions
diff --git a/interpreter/Elymas.pm b/interpreter/Elymas.pm index b58bffd..5938462 100644 --- a/interpreter/Elymas.pm +++ b/interpreter/Elymas.pm @@ -445,59 +445,6 @@ sub resolve { return $scope->{$name} if(exists $scope->{$name}); return resolve($scope->{' parent'}, $data, $name) if(exists $scope->{' parent'}); - - if($name =~ /^(_+)(\d*)$/s) { - my @spec = split //, $2; - @spec = (0) unless @spec; - - return [sub { - my ($data, $scope) = @_; - - my @new; - foreach my $i (@spec) { - die "Stack underflow" if @$data < $i + 1; - push @new, $data->[-$i - 1]; - } - push @$data, @new; - }, ['func', 'auto-created of ' . $name], 'active']; - } elsif($name =~ /^(-+)([0-9*]*)$/s) { - my $max = length($1) - 1; - my @spec = split //, $2; - $max = $_ > $max? $_: $max foreach grep { $_ ne '*' } @spec; - - return [sub { - my ($data, $scope) = @_; - - my @buffer; - foreach (0 .. $max) { - die "Stack underflow" unless @$data; - push @buffer, pop @$data; - } - - foreach my $i (@spec) { - if($i eq '*') { - execute($data, $scope); - } else { - push @$data, $buffer[$i]; - } - } - }, ['func', 'auto-created of ' . $name], 'active']; - } elsif($name =~ /^\*(\d*)$/s) { - my @spec = split //, $1; - - return [sub { - my ($data, $scope) = @_; - - my @buffer; - foreach my $i (@spec) { - die "Stack underflow" if @$data < $i + 2; - push @buffer, $data->[-$i - 2]; - } - execute($data, $scope); - push @$data, @buffer; - }, ['func', 'auto-created of ' . $name], 'active']; - } - return undef; } @@ -623,10 +570,10 @@ sub tokenize { } push @t, [$str, 'string']; - } elsif($line =~ /^([^a-zA-Z ]+)([a-zA-Z]+) +(.*)/s) { + } elsif($line =~ /^([^a-zA-Z0-9 ]+)([a-zA-Z0-9][^ ]*) +(.*)/s) { $line = "$1 $3"; push @t, [$2, 'string']; - } elsif($line =~ /^([a-zA-Z]+|[^a-zA-Z ]+) +(.*)/s) { + } elsif($line =~ /^([a-zA-Z0-9]+|[^a-zA-Z0-9 ]+) +(.*)/s) { $line = $2; push @t, [$1, 'tok']; } else { diff --git a/interpreter/ElymasGlobal.pm b/interpreter/ElymasGlobal.pm index 81da6f0..abd1f47 100644 --- a/interpreter/ElymasGlobal.pm +++ b/interpreter/ElymasGlobal.pm @@ -70,6 +70,45 @@ our $global = { my ($data, $scope) = @_; push @$data, [$quoted? 1: 0, 'int']; }, ['func', 'quoted'], 'active'], + '--' => [sub { + my ($data, $scope) = @_; + pop @$data; + }, ['func', '-'], 'active'], + '-' => [sub { + my ($data, $scope) = @_; + + my $spec = popString($data); + my $max = 0; + + my @spec = split //, $spec; + $max = $_ > $max? $_: $max foreach grep { $_ ne '*' } @spec; + + my @buffer; + foreach (0 .. $max) { + die "Stack underflow" unless @$data; + push @buffer, pop @$data; + } + + foreach my $i (@spec) { + if($i eq '*') { + execute($data, $scope); + } else { + push @$data, $buffer[$i]; + } + } + }, ['func', '-'], 'active'], + '_' => [sub { + my ($data, $scope) = @_; + + my $x = pop @$data or die "Stack underflow"; + push @$data, $x; + push @$data, $x; + }, ['func', '_'], 'active'], + '*' => [sub { + my ($data, $scope) = @_; + + execute($data, $scope); + }, ['func', '*'], 'active'], ';' => [sub { my ($data, $scope) = @_; |
