[svn:parrot] r46880 - in branches/ops_pct: compilers/opsc/src/Ops t/compilers/opsc

cotto at svn.parrot.org cotto at svn.parrot.org
Sat May 22 07:50:11 UTC 2010


Author: cotto
Date: Sat May 22 07:50:10 2010
New Revision: 46880
URL: https://trac.parrot.org/parrot/changeset/46880

Log:
[opsc] parse ops.num more carefully and store the match object for each line

Modified:
   branches/ops_pct/compilers/opsc/src/Ops/OpLib.pm
   branches/ops_pct/t/compilers/opsc/05-oplib.t

Modified: branches/ops_pct/compilers/opsc/src/Ops/OpLib.pm
==============================================================================
--- branches/ops_pct/compilers/opsc/src/Ops/OpLib.pm	Sat May 22 06:34:13 2010	(r46879)
+++ branches/ops_pct/compilers/opsc/src/Ops/OpLib.pm	Sat May 22 07:50:10 2010	(r46880)
@@ -98,10 +98,11 @@
     self<skip_file>  := $skip_file // './src/ops/ops.skip';
 
     # Initialize self.
-    self<max_op_num> := 0;
-    self<op_num_table>    := hash();
-    self<op_skip_table>  := hash();
-    self<ops_past>   := list();
+    self<max_op_num>    := 0;
+    self<op_num_table>  := hash();
+    self<op_skip_table> := hash();
+    self<num_file_lines>:= list();
+    self<ops_past>      := list();
 
     self.load_op_map_files();
 
@@ -125,38 +126,44 @@
     # slurp isn't very efficient. But extending NQP beyond bare minimum is not in scope.
     my $buf := slurp(self<num_file>);
     grammar NUM {
-        rule TOP { <op>+ }
+        rule TOP { <line>+ }
 
-        rule op { $<name>=(\w+) $<number>=(\d+) }
-        token ws {
+        rule line { 
             [
-            | \s+
-            | '#' \N*
-            ]*
+            | <op>
+            | <dynamic>
+            | <comment>
+            ]
         }
+        rule op { $<name>=(\w+) $<number>=(\d+) }
+        rule dynamic { '###DYNAMIC###' \N* }
+        rule comment { '#' \N* }
     }
 
     #say("Parsing NUM");
     my $ops := NUM.parse($buf);
     #_dumper($ops);
+    #pir::exit(0);
 
     my $prev := -1;
-    for $ops<op> {
-        my $name    := ~$_<name>;
-        my $number  := +$_<number>;
-        if (+$number) eq $number {
-            if ($prev + 1 != $number) {
-                die("hole in ops.num before #$number");
-            }
-            if self<op_num_table>.exists($name) {
-                die("duplicate opcode $name and $number");
-            }
-
-            $prev := $number;
-            self<op_num_table>{$name} := $number;
-            #say("$name maps to $number");
-            if ( $number > self<max_op_num> ) {
-                self<max_op_num> := $number;
+    for $ops<line> {
+        self<num_file_lines>.push($_);
+        if $_<op> {
+            my $name    := ~$_<op><name>;
+            my $number  := +$_<op><number>;
+            if (+$number) eq $number {
+                if ($prev + 1 != $number) {
+                    die("hole in ops.num before #$number");
+                }
+                if self<op_num_table>.exists($name) {
+                    die("duplicate opcode $name and $number");
+                }
+
+                $prev := $number;
+                self<op_num_table>{$name} := $number;
+                if ( $number > self<max_op_num> ) {
+                    self<max_op_num> := $number;
+                }
             }
         }
     }
@@ -203,15 +210,19 @@
 
 =item * C<num_file>
 
+=item * C<num_file_lines>
+
 =end ACCESSORS
 
-method max_op_num()    { self<max_op_num>; }
+method max_op_num()     { self<max_op_num>; }
+
+method op_num_table()   { self<op_num_table>; }
 
-method op_num_table()  { self<op_num_table>; }
+method op_skip_table()  { self<op_skip_table>; }
 
-method op_skip_table() { self<op_skip_table>; }
+method num_file()       { self<num_file>; }
 
-method num_file()      { self<num_file>; }
+method num_file_lines() { self<num_file_lines>; }
 
 # Local Variables:
 #   mode: perl6

Modified: branches/ops_pct/t/compilers/opsc/05-oplib.t
==============================================================================
--- branches/ops_pct/t/compilers/opsc/05-oplib.t	Sat May 22 06:34:13 2010	(r46879)
+++ branches/ops_pct/t/compilers/opsc/05-oplib.t	Sat May 22 07:50:10 2010	(r46880)
@@ -18,7 +18,7 @@
 say('# ' ~ $lib.max_op_num);
 
 # Check couple random ops.
-ok( $lib.op_num_table<end> == 0, "'end' have code 0");
+ok( $lib.op_num_table<end> == 0, "'end' has code 0");
 ok( $lib.op_num_table<set_addr_p_i> != 42, "'set_addr_p_i' have non 0 code");
 
 ok( $lib.op_skip_table<abs_i_ic>,       "'abs_i_ic' in skiptable");


More information about the parrot-commits mailing list