Also see book where I talk about errors (I think it's a free chapter).

http://media.pragprog.com/titles/tpantlr/errors.pdf

oh crap. just a sample not whole chapter. oh well. last page will get you 
started on "paraphrase" concept.

Ter

On Nov 24, 2010, at 4:47 PM, Michael Matera wrote:

> Hi Arthur,
> 
> I have a parser where I've spruced up the error messages to make more 
> sense to my users.  I overrode the (Java) methods:
> 
> String getErrorHeader(RecognitionException e)
> String getErrorMessage(RecognitionException e, String[] tokenNames)
> 
> In getErrorHeader() I look at the exception and determine how I want to 
> display where the error came from.  The RecognitionException has a 
> 'token' member (which may be null) and a line member.  If it has a token 
> then you may be able to get a filename from 
> token.getInputStream().getSourceName().
> 
> In getErrorMessage() I try to figure out why the parse error happened 
> and tell my users the human meaning of the error.  Mostly this means 
> doing something like this:
> 
> if (e instanceof UnwantedTokenException) {
>  ...
> } else if (e instanceof NoViableAltException) {
>  ...
> } else if (e instanceof FailedPredicateException) {
>  ...
> }
> 
> Pay special attention to FailedPredicateException because that exception 
> stores the string of the failed predicate.  You can match it to say what 
> it really means.  But be aware if multiple predicates were excluded you 
> may not get the one that's "really" the problem.
> 
> One other tip:  Because my parser rules structurally resemble my 
> language (I have a rule for 'if' and 'for' and 'while', etc).  I can use 
> the stack trace inside the exception to see what rule I was in.  That 
> way I can tell my user something like "Unexpected end to a 'for' 
> statement," when they forgot to close the conditions section.
> 
> Hope this helps.
> 
> Cheers
> ./m
> 
> 
> Here's a snipet from my parser:
> 
>> @members {
>> 
>> @Override
>> public String getErrorHeader(RecognitionException e) {
>>  ...
>> }
>> 
>> @Override
>> public String getErrorMessage(RecognitionException e, String[] tokenNames) {
>>  return ErrorReporting.getParseErrorMessage(this, e, tokenNames);
>> }
>> 
>> @Override
>> public void emitErrorMessage(String message) {
>>  Command.getSession().out.println(message);
>> }
> 
> 
> 
> Arthur Goldberg wrote:
>> Hello All
>> 
>> I'm writing a parser for a fairly simple language (14 rules & 10 tokens) 
>> that reads a description of a graph -- like this OncoPrint 
>> <http://cbio.mskcc.org/cancergenomics-dataportal/index.do?case_set_id=gbm_3way_complete&tab_index=tab_visualize&action=Submit&genetic_profile_ids=gbm_mutations&genetic_profile_ids=gbm_cna_rae&genetic_profile_ids=gbm_mrna_zscores&case_ids=&Z_SCORE_THRESHOLD=1.0&cancer_type_id=gbm&gene_list=EGFR+ERBB2+PDGFRA+MET+KRAS+NRAS+HRAS+NF1+SPRY2+FOXO1+FOXO3+AKT1+AKT2+AKT3+PIK3R1+PIK3CA+PTEN&gene_set_choice=glioblastoma:_rtk/ras/pi3k/akt_signaling_%2817_genes%29&;>
>>  
>> -- of cancer data and produces a data structure that will be used to 
>> select, organize and filter the data to be shown in the graph. Users 
>> will enter the language on our web site.
>> 
>> I have a working one-pass grammar, but after building it found that it's 
>> very difficult to produce error messages in one pass. For example, one 
>> might think that a failed semantic predicate would be a good place to 
>> report an error, but that doesn't work because exceptions are not thrown 
>> when predicates are hoisted and predicates are called multiple times as 
>> the parser backtracks to find a parse. (See my previous message on use 
>> of semantic predicates and hoisting 
>> <http://www.antlr.org/pipermail/antlr-interest/2010-November/040091.html>.)
>> 
>> I simply want to say things like
>> "Syntax error at 'xyz' at char <c> on line <l>"   // when the input 
>> syntax is wrong (I can't say "line 1:0 no viable alternative at input 
>> 'xyz'"), and
>> "<input> is not a valid <type> at char <c> on line <l>"   // when the 
>> input semantics is wrong, for example when <input> should be a word that 
>> fits a pattern that describes a genetic data type
>> 
>> Therefore, I'm told that one should postpone error reporting until 
>> later, and that I need a two pass grammar -- 1) build AST, 2) walk the 
>> tree -- to easily and accurately report errors. I've started down that 
>> path, and have a few productions in each grammar and a driver program 
>> that connects them and handles bits of input.
>> 
>> I think that I can report the syntax errors by overriding
>>    public void displayRecognitionError(String[] tokenNames, 
>> RecognitionException e) and
>>    public String getErrorMessage(RecognitionException e, String[] 
>> tokenNames)
>> in Phase 1,
>> 
>> But it isn't clear how one accesses data in the AST with the tree 
>> grammar. That is, inside the tree grammar how do I get the data I need 
>> to produce the semantic error message above?
>> 
>> Is that documented? I don't see it in The Definitive ANTLR Ref, Chap. 8 
>> or 10.
>> 
>> Thanks & Thanksgiving
>> Arthur
>> 
> 
> This email and any attachments are intended for the sole use of the named 
> recipient(s) and contain(s) confidential information that may be proprietary, 
> privileged or copyrighted under applicable law. If you are not the intended 
> recipient, do not read, copy, or forward this email message or any 
> attachments. Delete this email message and any attachments immediately.
> 
> 
> 
> 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

-- 
You received this message because you are subscribed to the Google Groups 
"il-antlr-interest" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en.

Reply via email to