[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