[antlr-interest] Re: exception thrown in syntatic predicate c an't be caught!

mzukowski at yci.com mzukowski at yci.com
Tue Apr 15 08:08:18 PDT 2003


I guess I wasn't clear.  The lexer would both skip to the next statement and
throw an exception.  Then the parser would always be able to sync to the
SEMI.  The other errors have to be handled in the parser, but your first
post was (I think) about the lexer throwing two exceptions and you not able
to handle that. 

The filter rule is supposed to handle everything that the non-protected
rules don't.  I don't understand why you would want it non-protected.  Have
you read the antlr.org article about "antlr meets SED?".  That covers the
rationale behind filter rules pretty well.
http://www.antlr.org/fieldguide/sed/index.html

Note that you probably also want to specify the character set that you
expect to handle.  Otherwise antlr only uses characters you reference.  See
http://www.antlr.org/doc/options.html#charVocabulary

Come back with more questions.

Monty

-----Original Message-----
From: martinkbraid [mailto:mbraid at sqlworks.com]
Sent: Monday, April 14, 2003 7:13 PM
To: antlr-interest at yahoogroups.com
Subject: [antlr-interest] Re: exception thrown in syntatic predicate c
an't be caught!


It's tricky. A stmt could be invalid because there are (a) invalid 
characters; (b) it is syntactically invalid (eg wrong sequence of 
tokens), or (c) it is semantically invalid (eg things stmt refers to 
doesn't exist). If it's invalid for any reason I want to skip to the 
next stmt. Trouble is, if the lexer skips to the next stmt (ie 
semicolon), the parser won't see the trailing invalid tokens and 
there is a possibility the initial subset of valid tokens are 
syntactically and semantically valid (ie I will have silently 
truncated the stmt - not good).

The problem would be simplified if the filter=rule option didn't 
necessarily require the rule to be protected, that way I could always 
let the parser deal with invalid tokens. I'm basically coming round 
to the idea I need a lexer rule that captures everything that isn't 
lexacaly(?) valid (using the ~) and let the parser deal with these 
tokens which will not fit any rule and correctly signify a 
syntactcally invalid stmt.

Thanks for your help.
Martin

PS. I'm parsing user written stmts, so you never know what's coming 
down the pike.

--- In antlr-interest at yahoogroups.com, mzukowski at y... wrote:
> Why do you have garbage characters in statements?
> 
> You could handle this in your lexer too, by consuming characters 
until you
> see a SEMICOLON, but you also have to handle comments and strings 
properly.
> Then when you throw that exception, the next thing the parser sees 
should
> always be a SEMICOLON.
> 
> Monty
> 
> -----Original Message-----
> From: martinkbraid [mailto:mbraid at s...]
> Sent: Monday, April 14, 2003 3:08 PM
> To: antlr-interest at yahoogroups.com
> Subject: [antlr-interest] Re: exception thrown in syntatic predicate
> can't be caught!
> 
> 
> The input to my lexer/parser is a series of statements delimited by 
> semicolons. I was using the lexer exception to tell the parser to 
> skip over the current statement and consumeUntil() the next 
semicolon 
> (ie skip over the remainder of the stmt). Since I posted my message 
I 
> made some progress by using the filter=rule option in the lexer and 
> have that rule automatically throw a TokenStreamException which my 
> parser captures. That works ... to a point. When the parser gets 
that 
> exception it does a consumeUntil(SEMICOLON), but if there is a 2nd 
> garabage character the lexer throws another exception and the whole 
> thing becomes a mess.
> 
> Think I'll heed your advice and look at controlling the lexer more 
> carefully.
> 
> 
> --- In antlr-interest at yahoogroups.com, mzukowski at y... wrote:
> > Syntactic predicates work by trying a piece of syntax and then 
> checking if
> > an exception was thrown.  When it finds a predicate that works it 
> then calls
> > the parser for real, with actions turned back on.  Syntactic 
> predicates
> > won't work if you can catch their exceptions.  Catch the 
exception 
> after the
> > predicate has decide where to go.
> > 
> > Or just catch and handle the exception in the lexer.  What 
exactly 
> are you
> > doing with the exceptions anyhow?
> > 
> > Monty
> > 
> > -----Original Message-----
> > From: martinkbraid [mailto:mbraid at s...]
> > Sent: Sunday, April 13, 2003 7:07 PM
> > To: antlr-interest at yahoogroups.com
> > Subject: [antlr-interest] exception thrown in syntatic predicate 
> can't
> > be caught!
> > 
> > 
> > Because I need to be able to handle garbage characters passed to 
my 
> > parser/lexer, I'm doing my own error processing in a top level 
rule 
> > by catching ANTLRExceptions. 
> > 
> > By chance, during syntactic predicate processing, the lexer 
> > encounters a garbage character and throws a TokenStreamException. 
> But 
> > because inputState.guessing > 0 (because it was in a syntactic 
> > predicate), my exception handler does NOT get control and the 
> > exception passes out of the parser. What do I do? It would be 
> > impossible to avoid syntatic predicates?
> > 
> > Thanks, Martin Braid
> > 
> > 
> >  
> > 
> > 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/


 

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