[antlr-interest] Pattern for returning errors from ANTLR in data structures, not STDERR
Terence Parr
parrt at cs.usfca.edu
Tue Nov 30 20:28:39 PST 2010
Let me be more specific.
In the v4 prerelease stuff, Tool.java has
// http://antlr.org/depot/antlr4/main/tool/src/org/antlr/v4/Tool.java
public void error(Message msg) {
if ( listeners.size()==0 ) {
defaultListener.error(msg);
return;
}
for (ANTLRToolListener l : listeners) l.error(msg);
}
using
http://antlr.org/depot/antlr4/main/tool/src/org/antlr/v4/tool/ANTLRToolListener.java
then in
http://antlr.org/depot/antlr4/main/tool/src/org/antlr/v4/parse/ToolANTLRParser.java
I do:
public void displayRecognitionError(String[] tokenNames,
RecognitionException e)
{
String msg = getParserErrorMessage(this, e);
if ( paraphrases.size()>0 ) {
String paraphrase = (String)paraphrases.peek();
msg = msg+" while "+paraphrase;
}
// List stack = getRuleInvocationStack(e, this.getClass().getName());
// msg += ", rule stack = "+stack;
tool.errMgr.syntaxError(ErrorType.SYNTAX_ERROR, getSourceName(), e.token, e, msg);
}
which forces all msgs from antlr to shunt to Tool.error(), which announces to listeners.
For testing, i have unit tests use this
http://antlr.org/depot/antlr4/main/tool/test/org/antlr/v4/test/ErrorQueue.java
as a listener to the tool like so:
Tool antlr = newTool(optionsA);
antlr.addListener(equeue);
Ter
On Nov 30, 2010, at 5:20 PM, Terence Parr wrote:
> Check ANTLRToolListener in antlr source or whatever. it has a similar problem to solve.
> Ter
> On Nov 30, 2010, at 5:13 PM, Arthur Goldberg wrote:
>
>> Hello All
>>
>> My ANTLR parser is embedded in other code. I've decided that reporting
>> errors out of the parser would be better handled as a list of errors,
>> not exceptions, so that the parse is allowed to recover from errors and
>> complete, if possible.
>> Does anyone have a working pattern for returning errors from ANTLR in a
>> list, not STDERR?
>> In more detail, I'd run it in two modes:
>> 1) testing: call some rule other than the root
>> In this case, I will let the rule report an error via an exception.
>>
>> 2) production: call the root rule
>> In this case, a newReportError() in
>>
>> catch (RecognitionException re) {
>> newReportError(re);
>> recover(input,re);
>> }
>>
>> would catch exceptions thrown by other rules, and store them in a list.
>> When the root rule returns, it returns the list of errors, along with
>> the results of the parse.
>>
>> If someone can help me with this, I'll make it worth your while. I'm
>> running out of time for messing with ANTLR.
>>
>> Thanks
>> Arthur
>>
>>
>> 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
More information about the antlr-interest
mailing list