[antlr-interest] A look-ahead/rewind problem

Lukasz Guminski lguminski+antlr at gmail.com
Mon Mar 23 08:02:47 PDT 2009


Thank you, but it doesn't work. LT(k) returns a character. I am sending you
my grammar and the output I got.

Grammar:
grammar block;
options{
 k = 3;
}

@members{
  Stack<String> stack = new Stack<String>();
  boolean isBlockOpen(String name)
  {
     System.out.println("isBlockOpen() has been invoked with a value : " +
name);
     return stack.size()==0||!stack.peek().equals(name);
  }
}


data: blocks EOF;
blocks:block+;
block: block_open blocks? block_close;
block_open
    :  {isBlockOpen(input.LT(3).getText())}? =>
    BLOCK_BOUNDARY SPACE block_name NEWLINE
{stack.push($block_name.text);System.out.println("start of block " +
$block_name.text);};
block_close:BLOCK_BOUNDARY SPACE block_name NEWLINE {System.out.println("end
of block " + $block_name.text);stack.pop();};
block_name:LETTER+ ALPHANUM*;


SPACE    :     ' ';
LETTER    :     ('a'..'z'|'A'..'Z');
ALPHANUM    :    (LETTER|'0'..'9');
BLOCK_BOUNDARY     :     'BLOCK';
NEWLINE :     ( CR )? LF | CR;
fragment CR :'\r';
fragment LF : '\n';
INSIGNIFICANT_CHAR:.;

Input:
BLOCK number1
BLOCK number1
BLOCK number1
BLOCK number1

Output:
isBlockOpen() has been invoked with a value : n
isBlockOpen() has been invoked with a value : n
*start of block: number1*
isBlockOpen() has been invoked with a value : n
isBlockOpen() has been invoked with a value : n
isBlockOpen() has been invoked with a value : n
*start of block: number1*
isBlockOpen() has been invoked with a value : n
isBlockOpen() has been invoked with a value : n
isBlockOpen() has been invoked with a value : n
*start of block: number1*
isBlockOpen() has been invoked with a value : n
isBlockOpen() has been invoked with a value : n
isBlockOpen() has been invoked with a value : n
*start of block: number1*

Just for the record, the output I'd like to get is (without debug):
start of block: number1
end of block: number1
start of block: number1
end of block: number1

Thanks,
Lucas


2009/3/23 Andreas Meyer <andreas.meyer at smartshift.de>

> If you are in a parser rule, input.LT(2) gives you the second-next
> _token_, instead of a character (as inside a lexer rule). So it should
> work.
>
> Andreas
>
> Lukasz Guminski schrieb:
> > input.LT(2).getText() does not work because it returns only the next
> > character. So when I have
> >
> > BLOCK with_a_very_long_name
> >
> > then LT(2) does not return the full name. Of course, I can set
> >
> > options{
> >    k = 100;
> > }
> >
> > but that's not the solution.
> > Lucas
> >
> >
> > 2009/3/23 Andreas Meyer <andreas.meyer at smartshift.de
> > <mailto:andreas.meyer at smartshift.de>>
> >
> >     Lukasz Guminski schrieb:
> >     >
> >     >
> >     >
> >     >     I would suggest you try without the syntactic predicate,
> >     turn your
> >     >     semantic predicate into a gated semantic predicate {...}? =>
> >     such that
> >     >     it is forced to be evaluated:
> >     >
> >     >     block_open: {is_block_open()}?=> BLOCK_BOUNDARY
> >     >
> >     >
> >     > I cannot use a function without a parameter, because the decision
> >     > bases on the name of a block. So the function needs to be of a
> form:
> >     > /is_block_open(String blockName)/ function, and retrieving the
> >     > parameter requires the parser to make a look-ahead. That's what
> >     I need
> >     > the syntactic predicate for.
> >     Yes, that was meant as an example. If you need lookahead, you may
> also
> >     consider using something like
> >     input.LT(2).getText().equals(mystackofnames.top()).  Anyway, have you
> >     tried turning the sem. predicate into a gated sem. predicate (just
> >     add a
> >     => after the ?)
> >
> >     Andreas
> >
> >     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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20090323/1ae981c1/attachment.html 


More information about the antlr-interest mailing list