On Thursday, Jun 5, 2003 "h. w. neff" said:

> hi.
> in an attempt to shift & merge returned results, i find i
>    cannot use '>>' or '<<' in a p::rd executable block; i
>    must instead divide and multiply, respectively.
> e.g. in this code, 'goodrule' works, 'badrule' does not: 
> 
>   sub_rule :   /[0-7]/
>   goodrule : /reg1/i '=' sub_rule ',' /reg2/i '=' sub_rule ';'
>      {
>         $main::machineword = $item[3] * 8 | $item[7];
>         1
>      }
>   badrule : /reg1/i '=' sub_rule ',' /reg2/i '=' sub_rule ';'
>      {
>         $main::machineword = $item[3] << 3 | $item[7];
>         1
>      }
> 
> by 'not working' i mean i get undefined sub-rules and
>    such as if i was getting file/stream type redirection
>    instead of the shifts i want.

I suspect you have not correctly analyzed the problem.  Here is my test case:

#!/usr/intel/pkgs/perl/5.005_03/bin/perl
BEGIN {$::RD_HINT=1;
       $::RD_TRACE=100;}
use lib "my version of 1.80 of P::RD";
use Parse::RecDescent;
my $grammar = q {
  sub_rule :   /[0-7]/
  goodrule : /reg1/i '=' sub_rule ',' /reg2/i '=' sub_rule ';'
     {
        $main::machineword = $item[3] * 8 | $item[7];
         print "item 3 $item[3] $item[7] $main::machineword\n";
        1
     }
  badrule : /reg1/i '=' sub_rule ',' /reg2/i '=' sub_rule ';'
     {
        $main::machineword = $item[3] << 3 | $item[7];
         print "item 3 $item[3] $item[7] $main::machineword\n";
        1
     }
};
my $parserRef = new Parse::RecDescent($grammar); 
print "Good rule returns:",$parserRef->goodrule("reg1 = 1 , reg2 = 2;")," 
'$main::machineword' \n";
print "Bad rule returns: ",$parserRef->badrule("reg1 = 1 , reg2 = 2;")," 
'$main::machineword'\n";
exit;


I get the following:

unix> test.pl
    Parse::RecDescent: Treating "sub_rule :" as a rule declaration
    Parse::RecDescent: Treating "/[0-7]/" as a /../ pattern terminal
    Parse::RecDescent: Treating "goodrule :" as a rule declaration
    Parse::RecDescent: Treating "/reg1/i" as a /../ pattern terminal
    Parse::RecDescent: Treating "=" as a literal terminal
    Parse::RecDescent: Treating "sub_rule" as a subrule match
    Parse::RecDescent: Treating "," as a literal terminal
    Parse::RecDescent: Treating "/reg2/i" as a /../ pattern terminal
    Parse::RecDescent: Treating "=" as a literal terminal
    Parse::RecDescent: Treating "sub_rule" as a subrule match
    Parse::RecDescent: Treating ";" as a literal terminal
    Parse::RecDescent: Treating "{ $main::machineword = $item[3] * 8 |
                       $item[7]; print "item 3 $item[3] $item[7]
                       $main::machineword\n"; 1 }" as an action
    Parse::RecDescent: Treating "badrule :" as a rule declaration
    Parse::RecDescent: Treating "/reg1/i" as a /../ pattern terminal
    Parse::RecDescent: Treating "=" as a literal terminal
    Parse::RecDescent: Treating "sub_rule" as a subrule match
    Parse::RecDescent: Treating "," as a literal terminal
    Parse::RecDescent: Treating "/reg2/i" as a /../ pattern terminal
    Parse::RecDescent: Treating "=" as a literal terminal
    Parse::RecDescent: Treating "sub_rule" as a subrule match
    Parse::RecDescent: Treating ";" as a literal terminal
    Parse::RecDescent: Treating "{ $main::machineword = $item[3] << 3 |
                       $item[7]; print "item 3 $item[3] $item[7]
                       $main::machineword\n"; 1 }" as an action
printing code (21354) to RD_TRACE
|  goodrule  |Trying rule: [goodrule]                   |
|  goodrule  |                                          |"reg1 = 1 , reg2 = 
2;"
|  goodrule  |Trying production: [/reg1/i '=' sub_rule  |
|            |',' /reg2/i '=' sub_rule ';']             |
|  goodrule  |Trying terminal: [/reg1/i]                |
|  goodrule  |>>Matched terminal<< (return value:       |
|            |[reg1])                                   |
|  goodrule  |                                          |" = 1 , reg2 = 2;"
|  goodrule  |Trying terminal: ['=']                    |
|  goodrule  |>>Matched terminal<< (return value: [=])  |
|  goodrule  |                                          |" 1 , reg2 = 2;"
|  goodrule  |Trying subrule: [sub_rule]                |
|  sub_rule  |Trying rule: [sub_rule]                   |
|  sub_rule  |Trying production: [/[0-7]/]              |
|  sub_rule  |Trying terminal: [/[0-7]/]                |
|  sub_rule  |>>Matched terminal<< (return value: [1])  |
|  sub_rule  |                                          |" , reg2 = 2;"
|  sub_rule  |>>Matched production: [/[0-7]/]<<         |
|  sub_rule  |>>Matched rule<< (return value: [1])      |
|  sub_rule  |(consumed: [ 1])                          |
|  goodrule  |>>Matched subrule: [sub_rule]<< (return   |
|            |value: [1]                                |
|  goodrule  |Trying terminal: [',']                    |
|  goodrule  |>>Matched terminal<< (return value: [,])  |
|  goodrule  |                                          |" reg2 = 2;"
|  goodrule  |Trying terminal: [/reg2/i]                |
|  goodrule  |>>Matched terminal<< (return value:       |
|            |[reg2])                                   |
|  goodrule  |                                          |" = 2;"
|  goodrule  |Trying terminal: ['=']                    |
|  goodrule  |>>Matched terminal<< (return value: [=])  |
|  goodrule  |                                          |" 2;"
|  goodrule  |Trying subrule: [sub_rule]                |
|  sub_rule  |Trying rule: [sub_rule]                   |
|  sub_rule  |Trying production: [/[0-7]/]              |
|  sub_rule  |Trying terminal: [/[0-7]/]                |
|  sub_rule  |>>Matched terminal<< (return value: [2])  |
|  sub_rule  |                                          |";"
|  sub_rule  |>>Matched production: [/[0-7]/]<<         |
|  sub_rule  |>>Matched rule<< (return value: [2])      |
|  sub_rule  |(consumed: [ 2])                          |
|  goodrule  |>>Matched subrule: [sub_rule]<< (return   |
|            |value: [2]                                |
|  goodrule  |Trying terminal: [';']                    |
|  goodrule  |>>Matched terminal<< (return value: [;])  |
|  goodrule  |Trying action                             |
item 3 1 2 10
|  goodrule  |>>Matched action<< (return value: [1])    |
|  goodrule  |>>Matched production: [/reg1/i '='        |
|            |sub_rule ',' /reg2/i '=' sub_rule ';']<<  |
|  goodrule  |>>Matched rule<< (return value: [1])      |
|  goodrule  |(consumed: [])                            |
Good rule returns:1 '10' 
|  badrule   |Trying rule: [badrule]                    |
|  badrule   |                                          |"reg1 = 1 , reg2 = 
2;"
|  badrule   |Trying production: [/reg1/i '=' sub_rule  |
|            |',' /reg2/i '=' sub_rule ';']             |
|  badrule   |Trying terminal: [/reg1/i]                |
|  badrule   |>>Matched terminal<< (return value:       |
|            |[reg1])                                   |
|  badrule   |                                          |" = 1 , reg2 = 2;"
|  badrule   |Trying terminal: ['=']                    |
|  badrule   |>>Matched terminal<< (return value: [=])  |
|  badrule   |                                          |" 1 , reg2 = 2;"
|  badrule   |Trying subrule: [sub_rule]                |
|  sub_rule  |Trying rule: [sub_rule]                   |
|  sub_rule  |Trying production: [/[0-7]/]              |
|  sub_rule  |Trying terminal: [/[0-7]/]                |
|  sub_rule  |>>Matched terminal<< (return value: [1])  |
|  sub_rule  |                                          |" , reg2 = 2;"
|  sub_rule  |>>Matched production: [/[0-7]/]<<         |
|  sub_rule  |>>Matched rule<< (return value: [1])      |
|  sub_rule  |(consumed: [ 1])                          |
|  badrule   |>>Matched subrule: [sub_rule]<< (return   |
|            |value: [1]                                |
|  badrule   |Trying terminal: [',']                    |
|  badrule   |>>Matched terminal<< (return value: [,])  |
|  badrule   |                                          |" reg2 = 2;"
|  badrule   |Trying terminal: [/reg2/i]                |
|  badrule   |>>Matched terminal<< (return value:       |
|            |[reg2])                                   |
|  badrule   |                                          |" = 2;"
|  badrule   |Trying terminal: ['=']                    |
|  badrule   |>>Matched terminal<< (return value: [=])  |
|  badrule   |                                          |" 2;"
|  badrule   |Trying subrule: [sub_rule]                |
|  sub_rule  |Trying rule: [sub_rule]                   |
|  sub_rule  |Trying production: [/[0-7]/]              |
|  sub_rule  |Trying terminal: [/[0-7]/]                |
|  sub_rule  |>>Matched terminal<< (return value: [2])  |
|  sub_rule  |                                          |";"
|  sub_rule  |>>Matched production: [/[0-7]/]<<         |
|  sub_rule  |>>Matched rule<< (return value: [2])      |
|  sub_rule  |(consumed: [ 2])                          |
|  badrule   |>>Matched subrule: [sub_rule]<< (return   |
|            |value: [2]                                |
|  badrule   |Trying terminal: [';']                    |
|  badrule   |>>Matched terminal<< (return value: [;])  |
|  badrule   |Trying action                             |
item 3 1 2 10
|  badrule   |>>Matched action<< (return value: [1])    |
|  badrule   |>>Matched production: [/reg1/i '='        |
|            |sub_rule ',' /reg2/i '=' sub_rule ';']<<  |
|  badrule   |>>Matched rule<< (return value: [1])      |
|  badrule   |(consumed: [])                            |
Bad rule returns: 1 '10'


I see nothing wrong so your "problem report" has not been reproduced.  Can 
you recreate this problem *exactly* in a smaller test case?

(Oooh, the next bit is FUGLY...)

> as a result, i've ended up with exe blocks that look like:
> 
>    {
>       $main::Instruction_upper = 0x440000
>                                | ($item[1] / 2048)
>                                | $item[4]
>                                | ($item[8] / 512)
>                                | ($item[10] * 16)
>                                | (($item[26] & 0x000010) / 16)
>                                | ($item[32] / 2)
>                               ;
>       $main::Instruction_lower = 0x000000
>                                | ($item[14] * 2)
>                                | ($item[16] / 2048)
>                                | ($item[20] * 16)
>                                | ($item[22] / 128)
>                                | (($item[26] & 0x00000C) * 1048576)
>                                | (($item[28] & 0xC00000) / 16384)
>                                | (($item[28] & 0x000003) * 1024)
>                                | (($item[34] & 0xC00000) / 1024)
>                                | (($item[34] & 0x000003) * 16384)
>                               ;
>      1
>    }
> 
> it does what's desired, but from a maintenance point of view
>    it is just not clear, without doing some math, what the
>    various shifts are.
> not to mention the increased chances of a typo in these magic
>    numbers!
> 
> any ideas about where i've gone wrong in trying to use the
>    bit shifts?
> or is this a bug in p::rd ?
> thanks.
> hwn
> 

--
 Intel, Corp.
 5000 W. Chandler Blvd.
 Chandler, AZ 85226

-- 
 Intel, Corp.
 5000 W. Chandler Blvd.
 Chandler, AZ  85226


Reply via email to