[antlr-interest] Re: A way to reuse Lexer, Parser and TreeWalker instances?
aaanwar
aaanwar at yahoo.com
Thu Apr 24 03:54:51 PDT 2003
you could use, aspectj to break the encapsulation ...
www.aspectj.org .. and getters, setters or other fields and methods,
Arman.
--- In antlr-interest at yahoogroups.com, "Brian Hagenbuch"
<bhagenbuch at d...> wrote:
> --- In antlr-interest at yahoogroups.com, "oneway_111"
<oneway_111 at y...>
> wrote:
> > --- In antlr-interest at yahoogroups.com, mzukowski at y... wrote:
> > > I believe everything uses an InputState object to hold state.
> That
> > needs
> > > reset and you can reuse your lexer, parser or tree parser. You
> are
> > > responsible for handling any instance variables you introduce.
> > >
> > > Monty
> >
> > Thanks, looks like it could work. Has anyone actually had success
> with
> > this?
>
> We found that there are a few protected fields in the lexer and
parser that we needed
> to reset in addition to resetting the input state object. Worse,
there don't seem to be
> public set functions for all of them. We use a too-complicated
subclassing scheme
> to solve the problem (as least we think we've solved it). We'd
love to hear that there's
> an easier way.
>
> In outline, here's what we do (manual excerpt, typos likely):
>
>
> class L extends GeneratedLexer {
>
> private boolean savedCaseSensitive;
> private boolean savedCaseSensitiveLiterals;
>
> public L(Reader in) {
> super(in)
> savedCaseSensitive = lexer.getCaseSensitive();
> savedCaseSensitiveLiterals =
lexer.getCaseSensitiveLiterals();
> }
>
> public void prepareNextInput(Reader in) {
>
> CharBuffer buf = new CharBuffer(in);
> LexerSharedInputState state = new
LexerSharedInputState(buf);
> this.setInputState(state);
>
> this.setCaseSensitive(savedCaseSensitive);
>
> // no set method for this protected field.
> this.caseSensitiveLiterals =
savedCaseSensitiveLiterals;
> }
> }
>
> class P extends GeneratedParser {
>
> public P(TokenStream lexer)
> {
> super(lexer);
> }
>
> public void resetState() {
>
> // no set method for this protected field.
> this.traceDepth = 0;
>
> this.getInputState().reset();
> }
>
> To reset a lexer and associated parser:
>
> lexer.prepareNextStatement(...some Reader...);
> parser.resetState();
>
> Hope this helps.
Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
More information about the antlr-interest
mailing list