cvsuser     03/06/27 12:12:49

  Modified:    languages/BASIC/compiler COMP_expressions.pm
                        COMP_parsefuncs.pm COMP_parser.pm compile.pl
                        testsuite.pl
  Log:
  Almost got COMMON working right...
  
  Revision  Changes    Path
  1.15      +2 -2      parrot/languages/BASIC/compiler/COMP_expressions.pm
  
  Index: COMP_expressions.pm
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/COMP_expressions.pm,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -w -r1.14 -r1.15
  --- COMP_expressions.pm       26 Jun 2003 03:24:15 -0000      1.14
  +++ COMP_expressions.pm       27 Jun 2003 19:12:49 -0000      1.15
  @@ -455,8 +455,8 @@
                                } else {
                                        $$optype="N";
                                }
  -                             #print "Registering $sym\n";
  -                             $main::code{$main::seg}->{declarations}->{$sym}=1;
  +                             $main::code{$main::seg}->{declarations}->{$sym}=1
  +                                     unless 
$main::code{$main::seg}->{declarations}->{$sym} or $main::common{$sym};
                        }
                        return $sym;
                } elsif ($type eq "STARTARG") {
  
  
  
  1.18      +24 -1     parrot/languages/BASIC/compiler/COMP_parsefuncs.pm
  
  Index: COMP_parsefuncs.pm
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/COMP_parsefuncs.pm,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -w -r1.17 -r1.18
  --- COMP_parsefuncs.pm        26 Jun 2003 03:24:15 -0000      1.17
  +++ COMP_parsefuncs.pm        27 Jun 2003 19:12:49 -0000      1.18
  @@ -7,7 +7,7 @@
   use vars qw( %arrays );
   use vars qw( $funcname $subname );
   use vars qw( %labels $branchseq @selects);
  -use vars qw( @data $sourceline );
  +use vars qw( @data $sourceline %common );
   use vars qw( %code $debug $runtime_jump);
   
   
  @@ -17,6 +17,29 @@
   @selects=();
   my $scopes=0;
   my @data=();
  +sub parse_common {
  +     feedme();
  +     while($type[CURR] !~ /COMP|COMM|STMT/) {
  +             $var=$syms[CURR];
  +             feedme();
  +             next if $var eq ",";
  +             my $array=0;
  +             if ($syms[CURR] eq "(") {
  +                     $array=1;
  +                     while($syms[CURR] ne ")") {
  +                             feedme;
  +                     }
  +                     feedme;
  +             }
  +             $var=~s/\$$/_string/;
  +             push @{$code{$seg}->{code}}, "\t# $var was declared COMMON\n"; 
  +             if (! $array) {
  +                     $main::code{$main::seg}->{declarations}->{$var}="COMMON";
  +                     $common{$var}=1;
  +             }
  +
  +     }
  +}
   
   sub parse_shared {           # Keyword only
        feedme();
  
  
  
  1.13      +1 -1      parrot/languages/BASIC/compiler/COMP_parser.pm
  
  Index: COMP_parser.pm
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/COMP_parser.pm,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -w -r1.12 -r1.13
  --- COMP_parser.pm    24 Jun 2003 01:54:14 -0000      1.12
  +++ COMP_parser.pm    27 Jun 2003 19:12:49 -0000      1.13
  @@ -140,7 +140,7 @@
                while | wend | dim | type | exit | function | for | next |
                do | loop | goto | gosub | return  | sub | call | select | case |
                read | restore | input | open | close | on | randomize | stop | swap |
  -             shared | cls | locate | color
  +             common | cls | locate | color
                )$/x) {
                no strict 'refs';
                &{"parse_" . $1}();
  
  
  
  1.11      +30 -2     parrot/languages/BASIC/compiler/compile.pl
  
  Index: compile.pl
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/compile.pl,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -w -r1.10 -r1.11
  --- compile.pl        17 Jun 2003 02:51:54 -0000      1.10
  +++ compile.pl        27 Jun 2003 19:12:49 -0000      1.11
  @@ -7,7 +7,7 @@
   use strict;
   use Getopt::Std;
   use vars qw( @tokens @tokdsc);
  -use vars qw(%code %options @basic);
  +use vars qw(%code %options @basic %common);
   use vars qw( @syms @type );
   use vars qw( %labels $runtime_jump $debug  $sourceline);
   use COMP_toker;
  @@ -46,18 +46,46 @@
   open(CODE, ">TARG_test.imc") || die;
   
   print CODE qq{.include "RT_initialize.pasm"\n};
  +#
  +# Take care of the COMMON declarations
  +#
  +if (keys %common) {
  +     my %code_copy=%code;
  +     print CODE "# Declarations of common variables\n";
  +     foreach my $seg ("_main", "_basicmain", keys %code) {
  +             next unless exists $code{$seg};
  +             if (exists $code{$seg}->{declarations}) {
  +                     foreach my $var (sort keys %{$code{$seg}->{declarations}}) {
  +                             next unless $code{$seg}->{declarations}->{$var} eq 
"COMMON";
  +                             if ($var=~/_string$/) {
  +                                     print CODE ".local string $var\n";
  +                             } else {
  +                                     print CODE ".local float $var\n";
  +                             }
  +                             delete $code{$seg}->{declarations}->{$var};
  +                     }
  +             }
  +             delete $code{$seg};
  +     }
  +     %code=%code_copy;
  +}
  +
  +
   foreach my $seg ("_main", "_basicmain", keys %code) {
        next unless exists $code{$seg};
        my @debdecl=();
  +     my @init=();
   
        print CODE ".sub $seg\n";
        if (exists $code{$seg}->{declarations}) {
                foreach my $var (sort keys %{$code{$seg}->{declarations}}) {
                        if ($var=~/_string$/) {
                                print CODE "\t.local string $var\n";
  +                             push @init, qq{\t\tset $var, ""\n};
                                push @debdecl, "\t\tset \$P1[\"$var\"], $var\n";
                        } else {
                                print CODE "\t.local float $var\n";
  +                             push @init, qq{\t\tset $var, 0.0\n};
                                push @debdecl, "\t\tset \$S0, $var\n\t\tset 
\$P1[\"$var\"], \$S0\n";
                        }
   
  @@ -65,7 +93,7 @@
        }
        print CODE<<INIT;
        .sub ${seg}_run                 # Always jump here.
  -             call ${seg}_main
  [EMAIL PROTECTED]             call ${seg}_main
                ret
        .end
   INIT
  
  
  
  1.11      +16 -0     parrot/languages/BASIC/compiler/testsuite.pl
  
  Index: testsuite.pl
  ===================================================================
  RCS file: /cvs/public/parrot/languages/BASIC/compiler/testsuite.pl,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -w -r1.10 -r1.11
  --- testsuite.pl      26 Jun 2003 03:24:15 -0000      1.10
  +++ testsuite.pl      27 Jun 2003 19:12:49 -0000      1.11
  @@ -32,6 +32,22 @@
   }
   
   __DATA__
  +' Expect 5, 0, "Hello"
  +common i, a$
  +sub mysub
  +     print "In the sub\n"
  +     print i
  +     print j
  +     print a$
  +     print c$
  +end sub
  +j=2
  +i=5
  +a$="Hello"
  +c$="WRONG"
  +call mysub()
  +
  +STOPPLEASE
   ' Passing string arrays, expect 99 and "Hello"
   function foo(i, thing$())
        print i
  
  
  

Reply via email to