cvsuser 02/09/05 08:04:27
Modified: . MANIFEST core.ops
languages/scheme/Scheme Generator.pm Tokenizer.pm
t/op string.t
Log:
chr op, and scheme fixes
Revision Changes Path
1.209 +7 -0 parrot/MANIFEST
Index: MANIFEST
===================================================================
RCS file: /cvs/public/parrot/MANIFEST,v
retrieving revision 1.208
retrieving revision 1.209
diff -u -w -r1.208 -r1.209
--- MANIFEST 4 Sep 2002 23:14:46 -0000 1.208
+++ MANIFEST 5 Sep 2002 15:03:23 -0000 1.209
@@ -58,6 +58,8 @@
config/gen/config_h/config_h.in
config/gen/config_pm.pl
config/gen/config_pm/Config_pm.in
+config/gen/libparrot_def.pl
+config/gen/libparrot_def/libparrot_def.in
config/gen/makefiles.pl
config/gen/makefiles/classes.in
config/gen/makefiles/docs.in
@@ -68,6 +70,7 @@
config/gen/makefiles/perl6.in
config/gen/makefiles/root.in
config/gen/makefiles/scheme.in
+config/gen/makefiles/imcc.in
config/gen/myconfig.pl
config/gen/myconfig/myconfig.in
config/gen/platform.pl
@@ -379,6 +382,7 @@
languages/perl6/examples/mandel.p6
languages/perl6/examples/qsort.p6
languages/perl6/mkdistro.sh
+languages/perl6/overview.pod
languages/perl6/pconfig.pl
languages/perl6/perl6
languages/perl6/perl6re/Perl6RE.bnf
@@ -435,6 +439,7 @@
languages/perl6/t/parser/speed_3.exp
languages/perl6/t/parser/speed_3.pl
languages/perl6/t/rx/basic.t
+languages/perl6/t/rx/call.t
languages/perl6/t/rx/special.t
languages/python/python.bnf
languages/python/python.prd
@@ -488,6 +493,7 @@
languages/ruby/t/01_terminal.t
languages/ruby/t/02_expression.t
languages/scheme/Scheme.pm
+languages/scheme/Scheme/Builtins.pm
languages/scheme/Scheme/Generator.pm
languages/scheme/Scheme/Parser.pm
languages/scheme/Scheme/Test.pm
@@ -499,6 +505,7 @@
languages/scheme/t/harness
languages/scheme/t/io/basic.t
languages/scheme/t/logic/basic.t
+languages/scheme/t/logic/lists.t
lib/Class/Struct.pm
lib/Make.pm
lib/Parrot/BuildUtil.pm
1.206 +16 -0 parrot/core.ops
Index: core.ops
===================================================================
RCS file: /cvs/public/parrot/core.ops,v
retrieving revision 1.205
retrieving revision 1.206
diff -u -w -r1.205 -r1.206
--- core.ops 5 Sep 2002 14:54:00 -0000 1.205
+++ core.ops 5 Sep 2002 15:03:23 -0000 1.206
@@ -201,6 +201,22 @@
goto NEXT();
}
+=item B<chr>(out STR, in INT)
+
+Returns the character represented by the $2 number in the ASCII
+character set.
+
+=cut
+
+inline op chr (out STR, in INT) {
+ STRING *s;
+ s = string_make(interpreter, &$1, (UINTVAL)1, NULL, 0, NULL);
+ *(char *)s->bufstart = $2;
+ s->strlen = 1;
+ $1 = s;
+ goto NEXT();
+}
+
########################################
1.3 +177 -4 parrot/languages/scheme/Scheme/Generator.pm
Index: Generator.pm
===================================================================
RCS file: /cvs/public/parrot/languages/scheme/Scheme/Generator.pm,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -r1.2 -r1.3
--- Generator.pm 24 Mar 2002 23:42:38 -0000 1.2
+++ Generator.pm 5 Sep 2002 15:03:55 -0000 1.3
@@ -2,6 +2,7 @@
use strict;
use Data::Dumper;
+use Scheme::Builtins;
sub _gensym {
return sprintf "G%04d",shift->{gensym}++;
@@ -39,6 +40,12 @@
@temp;
}
+sub _save_1 {
+ my $type = shift || 'I';
+ my @temp = _save 1, $type;
+ $temp[0];
+}
+
sub _restore {
die "Nothing to restore"
unless defined @_;
@@ -50,6 +57,15 @@
}
}
+sub _num_arg {
+ my ($node, $expected, $name) = @_;
+
+ my $children = scalar @{$node->{children}};
+
+ die "$name: Wrong number of arguments (expected $expected, got $children).\n"
+ if ($children != $expected);
+}
+
#------------------------------------
my $type_map = {
@@ -194,22 +210,105 @@
sub _op_equal_p {
}
-sub _op_pair {
+sub _op_pair_p {
+ my ($self, $node) = @_;
+ my $return;
+ my $label = $self->_gensym();
+
+ _num_arg ($node, 1, 'pair?');
+
+ my $item = $self->_generate($node->{children}->[0]);
+
+ $return = _save_1 ('I');
+
+ if ($item =~ /^[INS]/) {
+ $self->_add_inst ('', 'set', [$return,0]);
+ }
+ else {
+ $self->_add_inst ('', 'typeof', [$return,$item]);
+ $self->_add_inst ('', 'ne', [$return,'.Array',"FAIL_$label"]);
+ $self->_add_inst ('', 'set', [$return,$item]);
+ $self->_add_inst ('', 'ne', [$return,2,"FAIL_$label"]);
+ $self->_add_inst ('', 'set', [$return,1]);
+ $self->_add_inst ('', 'branch', ["DONE_$label"]);
+ $self->_add_inst ("FAIL_$label", 'set', [$return,0]);
+ $self->_add_inst ("DONE_$label");
+ }
+
+ return $return;
}
sub _op_cons {
+ my ($self, $node) = @_;
+ my $return;
+
+ _num_arg ($node, 2, 'cons');
+
+ my $car = $self->_generate($node->{children}->[0]);
+ $return = _save_1('P');
+
+ $self->_add_inst ('', 'new', [$return,'.Array']);
+ $self->_add_inst ('', 'set', [$return,2]);
+ $self->_add_inst ('', 'set', [$return.'[0]',$car]);
+ _restore ($car);
+
+ my $cdr = $self->_generate($node->{children}->[1]);
+ $self->_add_inst ('', 'set', [$return.'[1]', $cdr]);
+ _restore ($cdr);
+
+ return $return;
}
sub _op_car {
+ my ($self, $node) = @_;
+
+ _num_arg ($node, 1, 'car');
+
+ my $return = $self->_generate ($node->{children}->[0]);
+ die "car: Element not pair\n" unless $return =~ /^P/;
+ $self->_add_inst ('', 'set', [$return,$return.'[0]']);
+
+ return $return;
}
sub _op_cdr {
+ my ($self, $node) = @_;
+
+ _num_arg ($node, 1, 'cdr');
+
+ my $return = $self->_generate ($node->{children}->[0]);
+ die "cdr: Element not pair\n" unless $return =~ /^P/;
+ $self->_add_inst ('', 'set', [$return,$return.'[1]']);
+
+ return $return;
}
-sub _op_set_car {
+sub _op_set_car_bang {
+ my ($self, $node) = @_;
+
+ _num_arg ($node, 2, 'set-car!');
+
+ my $return = $self->_generate ($node->{children}->[0]);
+ die "set-car!: Element not pair\n" unless $return =~ /^P/;
+ my $value = $self->_generate ($node->{children}->[1]);
+ $self->_add_inst ('', 'set', [$return.'[0]',$value]);
+ _restore ($value);
+
+ return $return;
}
-sub _op_set_cdr {
+sub _op_set_cdr_bang {
+ my ($self, $node) = @_;
+
+ _num_arg ($node, 2, 'set-cdr!');
+
+ my $return = $self->_generate ($node->{children}->[0]);
+ die "set-cdr!: Element not pair\n" unless $return =~ /^P/;
+ my $value = $self->_generate ($node->{children}->[1]);
+ $self->_add_inst ('', 'set', [$return.'[1]',$value]);
+ _restore ($value);
+
+ return $return;
}
sub _op_null {
@@ -219,9 +318,53 @@
}
sub _op_list {
+ my ($self, $node) = @_;
+ my $label = $self->_gensym ();
+ my $return = _save_1 ('P');
+
+ $self->_add_inst ('', 'new',[$return,'.PerlUndef']);
+
+ return $return unless exists $node->{children};
+
+ for (reverse @{$node->{children}}) {
+ my $item = $self->_generate($_);
+ my $pair = _save_1 ('P');
+
+ $self->_add_inst ('', 'new',[$pair,'.Array']);
+ $self->_add_inst ('', 'set',[$pair,2]);
+ $self->_add_inst ('', 'set',[$pair.'[0]',$item]);
+ $self->_add_inst ('', 'set',[$pair.'[1]',$return]);
+ $self->_add_inst ('', 'set',[$return,$pair]);
+
+ _restore($item, $pair);
+ }
+
+ return $return;
}
sub _op_length {
+ my ($self, $node) = @_;
+ my $label = $self->_gensym ();
+ my $return = _save_1 ('I');
+
+ _num_arg ($node, 1, 'length');
+
+ my $list = $self->_generate($node->{children}->[0]);
+
+ $self->_add_inst ('', 'set',[$return,'0']);
+ my $type = _save_1 ('I');
+ $self->_add_inst ("NEXT_$label", 'typeof',[$type,$list]);
+ $self->_add_inst ('', 'eq',[$type,'.PerlUndef', "DONE_$label"]);
+ $self->_add_inst ('', 'ne',[$type,'.Array', "ERR_$label"]);
+ $self->_add_inst ('', 'inc',[$return]);
+ $self->_add_inst ('', 'set',[$list,$list.'[1]']);
+ $self->_add_inst ('', 'branch',["NEXT_$label"]);
+ # XXX Use exceptions here
+ $self->_add_inst ("ERR_$label", 'print',['"Object is not a list\n"']);
+
+ $self->_add_inst ("DONE_$label");
+
+ return $return;
}
sub _op_append {
@@ -903,7 +1046,20 @@
my ($self,$node) = @_;
for(@{$node->{children}}) {
my $temp = $self->_generate($_);
+ if ($temp =~ /[INS]/) {
$self->_add_inst('','print',[$temp]);
+ }
+ else {
+ $self->_use_function ('write');
+ if ($temp ne 'P5') {
+ $self->_add_inst('', 'save', ['P5']) if $regs->{P}{5};
+ $self->_add_inst('', 'set', ['P5',$temp]);
+ }
+ $self->_add_inst('', 'bsr', ['write_ENTRY']);
+ if ($temp ne 'P5' && $regs->{P}{5}) {
+ $self->_add_inst('', 'restore', ['P5']);
+ }
+ }
_restore($temp);
}
}
@@ -1264,6 +1420,13 @@
@max_len;
}
+sub _use_function {
+ my ($self, $name) = @_;
+
+ push @{$self->{functions}}, $name
+ unless grep { $_ eq $name } @{$self->{functitons}};
+}
+
sub _format_columns {
my $self = shift;
my $colref = $self->{instruction};
@@ -1290,6 +1453,7 @@
tree => $tree,
register => [(0) x 32],
gensym => 0,
+ functions=> [],
};
bless $self,$class;
}
@@ -1319,6 +1483,14 @@
$return;
}
+sub _link_buildins {
+ my ($self) = @_;
+
+ for (@{$self->{functions}}) {
+ Scheme::Builtins::generate ($self, $_);
+ }
+}
+
sub generate {
my $self = shift;
my @temp = _save(1);
@@ -1326,6 +1498,7 @@
#die Dumper($self->{tree});
_restore(@temp);
$self->_add_inst('',"end");
+ $self->_link_buildins();
$self->_format_columns();
}
1.3 +3 -0 parrot/languages/scheme/Scheme/Tokenizer.pm
Index: Tokenizer.pm
===================================================================
RCS file: /cvs/public/parrot/languages/scheme/Scheme/Tokenizer.pm,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -w -r1.2 -r1.3
--- Tokenizer.pm 24 Mar 2002 23:42:38 -0000 1.2
+++ Tokenizer.pm 5 Sep 2002 15:03:55 -0000 1.3
@@ -34,6 +34,9 @@
} elsif($ch eq '?' and
$token =~ /^[a-z]/) { # Question marks can follow an identifier
$token .= $ch;
+ } elsif($ch eq '!' and
+ $token =~ /^[a-z]/) { # Exclamation marks can follow an identifier
+ $token .= $ch;
} elsif($ch eq '=' and
$token =~ /^[<>]/) { # Equal sign can follow '<','>'
$token .= $ch;
1.32 +19 -1 parrot/t/op/string.t
Index: string.t
===================================================================
RCS file: /cvs/public/parrot/t/op/string.t,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -w -r1.31 -r1.32
--- string.t 4 Sep 2002 13:49:55 -0000 1.31
+++ string.t 5 Sep 2002 15:04:27 -0000 1.32
@@ -1,6 +1,6 @@
#! perl -w
-use Parrot::Test tests => 91;
+use Parrot::Test tests => 94;
use Test::More;
output_is( <<'CODE', <<OUTPUT, "set_s_s|sc" );
@@ -1000,6 +1000,24 @@
set S0,"ab"
ord I0,S0,-3
print I0
+ end
+CODE
+
+output_is(<<'CODE',chr(32),'chr of 32 is space in ASCII');
+ chr S0, 32
+ print S0
+ end
+CODE
+
+output_is(<<'CODE',chr(65),'chr of 65 is A in ASCII');
+ chr S0, 65
+ print S0
+ end
+CODE
+
+output_is(<<'CODE',chr(122),'chr of 122 is z in ASCII');
+ chr S0, 122
+ print S0
end
CODE