[antlr-interest] Is this a bug in Antlr?

mzukowski at yci.com mzukowski at yci.com
Thu Aug 7 09:39:27 PDT 2003


I recommend using the -traceParser option when invoking antlr.Tool to see
what is going on.  Also read through the generated code and see which test
is failing and throwing that exception.  That may give us a clue.

Monty

-----Original Message-----
From: Duncan Booth [mailto:duncan at rcp.co.uk] 
Sent: Thursday, August 07, 2003 6:27 AM
To: antlr-interest at yahoogroups.com
Subject: [antlr-interest] Is this a bug in Antlr?


I have a problem parsing a grammar, and it looks to me as though it 
may be a bug in Antlr, but then again maybe I'm just missing 
something obvious. I've cut the problem down to a (nearly) minimal 
grammar attached below.

Compile and run using:
   java antlr.Tool grammar.g
   csc GrammarTokenTypes.cs Grammar.cs /R:antlr.runtime.dll
   Grammar.exe

The output from the program is:
line 0:0: unexpected token [")",<5>,line=0,col=0]

The output I would expect from the program is:
 ( a )

I can get the expected output in a number of ways, e.g. removing 
either branch of the (unused) 'list_iter' rule, using the commented 
out line under the 'factor' rule instead of the current line. Any of 
these minor changes make the parser work the way I expect, but with 
the grammar as given below, the parser seems determined that an 
'expr' can never be followed by a ')'.

Any suggestions how to get this to parse the way I expect without 
breaking the grammar?

---- begin Grammar.g ----
header
{
        using antlr;
}

options
{
        language = "CSharp";
}

class Grammar extends Parser;
options
{
	k = 2;                           // two token lookahead
	buildAST = true;
	defaultErrorHandler = false;     // Don't generate parser error 
handlers
}

tokens
{
    LPAR    = "(";
    RPAR    = ")";
}

{
    class DummyTokenStream : TokenStream
    {
        protected Token[] tokens;
        protected int index;
        
        public DummyTokenStream(Token[] tokens)
        {
            this.tokens = tokens;
            index = 0;
        }
        
        public Token nextToken()
        {
            if (index < tokens.Length)
                return tokens[index++];
            return new CommonToken(EOF, "");
        }
    }
    public static void Main(string[] args) //throws Exception 
    {
        Token[] tokens = new Token[] {
            new CommonToken(LPAR, "("),
            new CommonToken(NAME, "a"),
            new CommonToken(RPAR, ")")
        };
        try
        {
            TokenStream s = new DummyTokenStream(tokens);
            Grammar parser = new Grammar(s);
            parser.expr();
            CommonAST t = (CommonAST)parser.getAST();
            Console.WriteLine(t.ToStringList());
        } catch(Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
}


expr:
        term (("+" | "-") term)* ;

term:
        factor (("*"| "/") factor)* ;

factor:
      atom (trailer)?;
//    atom;

atom:
        "(" (expr)? ")" 
      | NAME | NUMBER ;

trailer:
        "(" (expr)? ")" ;

list_iter:
        list_for |
        list_if ;

list_for:
        "for" expr "in" expr (list_iter)? ;

list_if:
        "if" expr (list_iter)? ;
---- end Grammar.g ------ 
Duncan Booth                                     
duncan at rcp.co.uk
int month(char *p){return(124864/((p[0]+p[1]- p[2]&0x1f)+1)%12)["\5\x8\3"
"\6\7\xb\1\x9\xa\2\0\4"];} // Who said my code was obscure?
http://dales.rmplc.co.uk/Duncan


 

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


 

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




More information about the antlr-interest mailing list