All --

If the assembler patch I submitted a little while ago goes in, I'll
commit these changes to the Jako compiler. They fix a bug in assignment
handling and add some more conditionals to while and if. Also it goes
back to using implicit opcodes in a few cases that were broken before
the assembler patch.


Regards,

-- Gregor
 _____________________________________________________________________ 
/     perl -e 'srand(-2091643526); print chr rand 90 for (0..4)'      \

   Gregor N. Purdy                          [EMAIL PROTECTED]
   Focus Research, Inc.                http://www.focusresearch.com/
   8080 Beckett Center Drive #203                   513-860-3570 vox
   West Chester, OH 45069                           513-860-3579 fax
\_____________________________________________________________________/
Index: jako_compiler.pl
===================================================================
RCS file: /home/perlcvs/parrot/little_languages/jako_compiler.pl,v
retrieving revision 1.3
diff -u -r1.3 jako_compiler.pl
--- jako_compiler.pl    2001/09/15 00:42:07     1.3
+++ jako_compiler.pl    2001/09/15 19:05:42
@@ -202,27 +202,29 @@
   my $prefix = "_W$block_count";
   push @block_stack, { TYPE => 'while', NEXT => $line, PREFIX => $prefix };
 
-  #
-  # TODO: Note that the assembler wasn't inferring the opcode qualifiers, so we had
-  # to code them explicitly. We should remove the qualifiers as soon as the
-  # assembler is fixed.
-  #
-
   if ($cond =~ m/^(.*)\s*==\s*(.*)$/) {
     my @args = map_args($1, $2);
-    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "eq_i_ic", "$args[0], $args[1], 
${prefix}_REDO, ${prefix}_LAST";
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "eq", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
     printf "%s_REDO:\n", $prefix;
   } elsif ($cond =~ m/^(.*)\s*!=\s*(.*)$/) {
     my @args = map_args($1, $2);
-    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ne_i_ic", "$args[0], $args[1], 
${prefix}_REDO, ${prefix}_LAST";
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ne", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
     printf "%s_REDO:\n", $prefix;
   } elsif ($cond =~ m/^(.*)\s*<=\s*(.*)$/) {
     my @args = map_args($1, $2);
-    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "le_i_ic", "$args[0], $args[1], 
${prefix}_REDO, ${prefix}_LAST";
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "le", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
     printf "%s_REDO:\n", $prefix;
+  } elsif ($cond =~ m/^(.*)\s*<\s*(.*)$/) {
+    my @args = map_args($1, $2);
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "lt", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
+    printf "%s_REDO:\n", $prefix;
   } elsif ($cond =~ m/^(.*)\s*>=\s*(.*)$/) {
+    my @args = map_args($1, $2);
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ge", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
+    printf "%s_REDO:\n", $prefix;
+  } elsif ($cond =~ m/^(.*)\s*>\s*(.*)$/) {
     my @args = map_args($1, $2);
-    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ge_i_ic", "$args[0], $args[1], 
${prefix}_REDO, ${prefix}_LAST";
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "gt", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
     printf "%s_REDO:\n", $prefix;
   } else {
     printf(STDERR "jako: Syntax error. Unrecognized condition in while on line 
%d.\n", $line);
@@ -242,28 +244,30 @@
   my $prefix = "_I$block_count";
   push @block_stack, { TYPE => 'if', NEXT => $line, PREFIX => $prefix };
 
-  #
-  # TODO: Note that the assembler wasn't inferring the opcode qualifiers, so we had
-  # to code them explicitly. We should remove the qualifiers as soon as the
-  # assembler is fixed.
-  #
-
   if ($cond =~ m/^(.*)\s*==\s*(.*)$/) {
     my @args = map_args($1, $2);
-    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "eq_i_ic", "$args[0], $args[1], 
${prefix}_REDO, ${prefix}_LAST";
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "eq", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
     printf "%s_REDO:\n", $prefix;
   } elsif ($cond =~ m/^(.*)\s*!=\s*(.*)$/) {
     my @args = map_args($1, $2);
-    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ne_i_ic", "$args[0], $args[1], 
${prefix}_REDO, ${prefix}_LAST";
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ne", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
     printf "%s_REDO:\n", $prefix;
   } elsif ($cond =~ m/^(.*)\s*<=\s*(.*)$/) {
+    my @args = map_args($1, $2);
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "le", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
+    printf "%s_REDO:\n", $prefix;
+  } elsif ($cond =~ m/^(.*)\s*<\s*(.*)$/) {
     my @args = map_args($1, $2);
-    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "le_i_ic", "$args[0], $args[1], 
${prefix}_REDO, ${prefix}_LAST";
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "lt", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
     printf "%s_REDO:\n", $prefix;
   } elsif ($cond =~ m/^(.*)\s*>=\s*(.*)$/) {
     my @args = map_args($1, $2);
-    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ge_i_ic", "$args[0], $args[1], 
${prefix}_REDO, ${prefix}_LAST";
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "ge", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
     printf "%s_REDO:\n", $prefix;
+  } elsif ($cond =~ m/^(.*)\s*>\s*(.*)$/) {
+    my @args = map_args($1, $2);
+    printf "%-12s %-8s %s\n", "${prefix}_NEXT:", "gt", "$args[0], $args[1], 
+${prefix}_REDO, ${prefix}_LAST";
+    printf "%s_REDO:\n", $prefix;
   } else {
     printf(STDERR "jako: Syntax error. Unrecognized condition in while on line 
%d.\n", $line);
   }
@@ -284,15 +288,8 @@
   my $block  = pop @block_stack;
   my $prefix = $block->{PREFIX};
 
-  #
-  # TODO: Note that the assembler wasn't inferring the opcode qualifiers, so we had
-  # to code them explicitly. We should remove the qualifiers as soon as the
-  # assembler is fixed.
-  #
-
   if ($block->{TYPE} eq 'while') {
-    printf("%-12s %-8s %s\n", '', 'branch_ic', "${prefix}_NEXT", );
-    # TODO: Is there a better unconditional jump (branch_ic)?
+    printf("%-12s %-8s %s\n", '', 'branch', "${prefix}_NEXT", );
   }
 
   printf "%s_LAST:\n", $prefix;
@@ -307,16 +304,10 @@
 {
   my $which = uc shift;
 
-  #
-  # TODO: Note that the assembler wasn't inferring the opcode qualifiers, so we had
-  # to code them explicitly. We should remove the qualifiers as soon as the
-  # assembler is fixed.
-  #
-
   foreach (reverse @block_stack) {
     if ($_->{TYPE} eq 'while') {
       my $prefix = $_->{PREFIX};
-      printf("%-12s %-8s %s\n", '', 'branch_ic', "${prefix}_$which", );
+      printf("%-12s %-8s %s\n", '', 'branch', "${prefix}_$which", );
       last;
     }
   }
@@ -541,8 +532,13 @@
   # a = "Howdy";
   #
  
-  if (m/^([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+(\.\d+))$/) {
+  if (m/^([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)$/) {
     assign_var($1, 'I', $2);
+    next;
+  }
+ 
+  if (m/^([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+\.\d+)$/) {
+    assign_var($1, 'N', $2);
     next;
   }
 

Reply via email to