Loading ...
Sorry, an error occurred while loading the content.

7912RE: [antlr-interest] Treewalking : non-determinism error

Expand Messages
  • Anthony Youngman
    Apr 2, 2003
      RE: [antlr-interest] Treewalking : non-determinism error

      Thanks Ric. Works a treat (I hope).

      By the way, Monty, why if I'm outputting code would I want to have my PRINT before my EXPR? If my PRINT comes first, surely it hasn't yet got an EXPR to print?

      Okay okay, I know everybody thinks in infix, but postfix or rpn is a damn sight easier to handle. Can I give you some advice? Namely it doesn't pay to jump to conclusions :-) You're dealing with a guru here (just that he knows bugger-all about Java or Antlr :-)

      My next difficult task will be making the compiler chuck everything out IN POSTFIX.

      Cheers,
      Wol

      -----Original Message-----
      From: Ric Klaren [mailto:klaren@...]
      Sent: 01 April 2003 15:40
      To: antlr-interest@yahoogroups.com
      Subject: Re: [antlr-interest] Treewalking : non-determinism error


      Hi,

      On Tue, Apr 01, 2003 at 11:56:28AM +0100, Anthony Youngman wrote:
      > I think I know what the problem is, I just don't know how to fix it ...
      >
      > In my main parser, I have the following two rules:
      >
      > printst : (pr:"PRINT"^ expr (COLONPRINT)? {System.out.println(pr+" print
      > ");} );
      > expr : ( catexpr | logicexpr ) ;
      >
      > This seems to be fine - the traces are printing what I expect.
      >
      > In my treewalker I then have the rule:
      >
      > printst
      >       : #(PRINT expr COLONPRINT) {System.out.println("PRNT");}
      >       | #(PRINT expr) {System.out.println("OUTP");}
      >       ;

      Provided I don't have a coffee shortage or overdose ;)

      Tree parsers only use a lookahead of 1 so the above rule will indeed give
      nondeterminism. One way to fix it might be:

      printst
              : ( #(PRINT expr COLONPRINT) ) => #(PRINT expr COLONPRINT) {System.out.println("PRNT");}
              | #(PRINT expr) {System.out.println("OUTP");}
              ;

      Alternatively:

      printst { bool colon = false; }
              : #(PRINT expr ( COLONPRINT { colon = true; } )? )
                      {
                              if( colon )
                                      System.out.println("PRNT");
                              else
                                      System.out.println("OUTP");
                      }
              ;

      Cheers,

      Ric
      --
      -----+++++*****************************************************+++++++++-------
          ---- Ric Klaren ----- j.klaren@... ----- +31 53 4893722  ----
      -----+++++*****************************************************+++++++++-------
        "You know how to use that thing?" [pointing to the sword]
        "Sure.. The pointy end goes into the other guy."
        --- The Mask of Zorro


       

      Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/



      This transmission is intended for the named recipient only. It may contain private and confidential information. If this has come to you in error you must not act on anything disclosed in it, nor must you copy it, modify it, disseminate it in any way, or show it to anyone. Please e-mail the sender to inform us of the transmission error or telephone ECA International immediately and delete the e-mail from your information system.

      Telephone numbers for ECA International offices are: Sydney +61 (0)2 9911 7799, Hong Kong + 852 2121 2388, London +44 (0)20 7351 5000 and New York +1 212 582 2333.

    • Show all 7 messages in this topic