aboutsummaryrefslogtreecommitdiff
path: root/interpreter
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter')
-rw-r--r--interpreter/Elymas.pm57
-rw-r--r--interpreter/ElymasGlobal.pm39
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) = @_;