That was exactly what I was looking for!
I added "-trace" to the "ANTLR options" section of ANTLRWorks/Preferences and 
started getting all the output I was looking for.

I found some documentation on the -trace option in the v2 section, but none in 
the v3 area.  Of note is that -trace works in v3, but -traceParser and 
-traceLexer don't do anything at all.  Looks like they've been deprecated.  No 
matter, it was pretty easy to get what I was looking for without them.

The method of getting similar behavior to those two options is as follows:

To turn off Lexer trace, override TraceIn and TraceOut (the 2 arg versions) in 
your lexer class, like so:

    public partial class PLSQL31Lexer
    {
        public override void TraceIn( string ruleName, int ruleIndex )
        {
            // Create no trace output for lexing
        }

        public override void TraceOut( string ruleName, int ruleIndex )
        {
            // Create no trace output for lexing
        }
    }

That leaves me with just parser trace, exactly what I was looking for.
I then override the same methods to redirect the trace from the stdout to the 
debugout:

using trace = System.Diagnostics.Trace;   // use this instead of private 
TextWriter trace!

    public partial class PLSQL31Parser
    {
        //private TextWriter trace = Console.Out; // This mirrors the behaviour 
we're overloading

        // Override the parser trace method so we can control where the 
information goes
        public override void TraceIn( string ruleName, int ruleIndex )
        {
            TraceIn( ruleName, ruleIndex, input.LT( 1 ) );
        }

        // Override the parser trace method so we can control where the 
information goes
        public override void TraceIn( string ruleName, int ruleIndex, object 
inputSymbol )
        {
            trace.Write( is_sql ? "(SQL)" : "(PL/)" );
            trace.Write( "enter " + ruleName + " " + inputSymbol );
            if (state.backtracking > 0)
            {
                trace.Write( " backtracking=" + state.backtracking );
            }
            trace.WriteLine( string.Empty );
        }

        // Override the parser trace method so we can control where the 
information goes
        public override void TraceOut( string ruleName, int ruleIndex, object 
inputSymbol )
        {
            trace.Write( is_sql ? "(SQL)" : "(PL/)" );
            trace.Write( "exit " + ruleName + " " + inputSymbol );
            if (state.backtracking > 0)
            {
                trace.Write( " backtracking=" + state.backtracking );
                trace.WriteLine( state.failed ? " FAILED!" : " succeeded" );
            }
            else
            {
                trace.WriteLine( string.Empty );
            }
        }

        // Override the parser trace method so we can control where the 
information goes
        public override void TraceOut( string ruleName, int ruleIndex )
        {
            TraceOut( ruleName, ruleIndex, input.LT( 1 ) );
        }
    }

Note that I can comment out my using statement and uncomment the private to 
easily switch from debugout to any other TextWriter stream I want.  Very handy!
With this setup it's a one-line change to generate a file that traces my 
parsing if I want it.

And of course, to get a -traceLexer behavior I'd just reverse my implementation.

Thanks Ter, very handy!
J

-----Original Message-----
From: antlr-interest-boun...@antlr.org 
[mailto:antlr-interest-boun...@antlr.org] On Behalf Of Terence Parr
Sent: Thursday, May 14, 2009 5:48 PM
To: Tilman Bender
Cc: antlr-inter...@antlr.org
Subject: Re: [antlr-interest] Parse trace?

-trace option will work great for you. recompile and when you run your  
parser traceIn/traceOut methods will be called. you can override them  
or use the default which spits out information.

Ter
On May 14, 2009, at 11:34 AM, Tilman Bender wrote:

> Hi Jay,
>
> I am sure what you mean by "annotatin my grammar with trace  
> statements".
> If you mean doing this manually for every rule/alternative: you need  
> not do that.
>
> As far as I see you can have ANTLR add such trace information for  
> you, so you do not have to do
> it manually. I've seen this as a config option in the antlr3-maven- 
> plugin and I am sure there is a corresponding
> ANTLR-Tool option for this.
>
> Another (maybe weird) idea: Isn't this a typical use case for AOP?  
> Would it be feasible to weave the logging
> into the whole thing? Just an idea ;-)
>
> Tilman Bender
> Student des Software Engineering
> Hochschule Heilbronn
> tben...@stud.hs-heilbronn.de
>
>
>
> Am 14.05.2009 um 20:07 schrieb West Jay - Toronto-MROC - external:
>
>> So far, the only option I've seen is annotating my grammar with  
>> trace statements that'll execute during parsing.  Ick.  Is there  
>> not a better way?
>
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: 
> http://www.antlr.org/mailman/options/antlr-interest/your-email-address


List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe: 
http://www.antlr.org/mailman/options/antlr-interest/your-email-address

List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe: 
http://www.antlr.org/mailman/options/antlr-interest/your-email-address

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"il-antlr-interest" group.
To post to this group, send email to il-antlr-interest@googlegroups.com
To unsubscribe from this group, send email to 
il-antlr-interest+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to