[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