[antlr-interest] Antlr3 does not report error with incorrect input.

Manu manunews at gmail.com
Mon Mar 5 09:25:24 PST 2007


Martin,

I think ANTLR 3 has automatic error recovery, inserting or removing a
token. You can disable it putting:

@rulecatch {
}

before the catalog rule.

Regards,
Manu

2007/3/5, Martin Fowler <fowler at acm.org>:
> I'm doing a simple hello-world style thing with Antlr 3 just to get it
> going. The idea is to read text in the form of
>
>   item camera
>   item laser
>
> where item is a keyword and I want to store all the things I read. I
> can write a grammar that reads in the values, but the odd thing is
> that this grammar doesn't seem to throw an exception if I put in
> something incorrect like "xitem camera". Instead it reads the file,
> not recognizing anything, and indicates no error. I would expect an
> error if the file contains text that doesn't conform to the
> grammar. Can anyone let me know where I'm goofing?
>
> BTW If I do this in AntlrWorks it does generate a NoViableAltException.
>
> Gory Details
> ============
>
> Here's the various files. I've looked at the tokens coming out the
> lexer, and for "xitem item" it reports two strings, as I would
> expect. The generated parser just looks for a token and if it isn't
> the 'item' keyword it seems to just terminate without an error.
>
> I'm running this using the IntelliJ plug in.
>
>
> ------------ Grammar File ----------------
>
> grammar Catalog;
>
> @header{
> package parser;
> import model.*;
> }
> @lexer::header {
> package parser;
> }
>
> @members {
>   public Configuration result = new Configuration();
> }
>
> catalog :  item*;
>
> item    : ITEM_DEC n=name {result.addItem(new Item ($n.text));};
>
> name    : STRING;
>
> ITEM_DEC
>        : 'item';
> STRING  : ('a'..'z' | 'A'..'Z')+ ;
>
> fragment NEWLINE:'\r' ? '\n' ;
> WS : (' ' |'\t' | NEWLINE)+ {skip();} ;
>
> ------------------ Test File --------------
>
> import static org.junit.Assert.*;
> import org.junit.*;
>
> import parser.*;
> import model.*;
>
> import java.io.*;
>
> public class CatalogTest {
>
>  // This test fails
>   @Test(expected = RuntimeException.class)
>   public void failOnParseError() {
>     StringReader input = new StringReader("xitem foo");
>     Configuration config = ParserCommand.parse(input);
>   }
>
> }
>
> ---- Command wrapper ----------------
> package parser;
>
> import model.*;
>
> import org.antlr.runtime.*;
>
> import java.io.*;
>
> public class ParserCommand {
>   private CatalogParser parser;
>   private Reader input;
>
>   public ParserCommand(Reader input) {
>     this.input = input;
>   }
>
>   public static Configuration parse(Reader input) {
>     ParserCommand cmd = new ParserCommand(input);
>     cmd.run();
>     return cmd.getConfiguration();
>   }
>
>   private Configuration getConfiguration() {
>     return parser.result;
>   }
>
>   public void run() {
>     try {
>       CatalogLexer lexer = new CatalogLexer(new ANTLRReaderStream(input));
>       CommonTokenStream tokens = new CommonTokenStream(lexer);
>       for (Object t : tokens.getTokens()) System.out.printf("<%s> = ", t);
>       parser = new CatalogParser(tokens);
>       parser.catalog();
>     } catch (Exception e) {
>       throw new RuntimeException(e);
>     }
>   }
>
> }
>
>
> --
> Martin Fowler
> http://martinfowler.com
>


More information about the antlr-interest mailing list