Related articles |
---|
Re: error recovery hankd@ee.ecn.purdue.edu (1989-04-30) |
Error recovery cayot@essi.fr (Cayot Robert-Olivier) (1997-03-21) |
Re: Error recovery gvcormac@plg.uwaterloo.ca (Gord Cormack) (1997-03-22) |
Re: Error recovery P.Whillance@ncl.ac.uk (Peter Whillance) (1997-03-27) |
Error Recovery markagr@aol.com (1997-05-12) |
Re: Error Recovery nandu@longs.dr.lucent.com (1997-05-25) |
Re: Error Recovery tc@charlie.cns.iit.edu (Thomas W. Christopher) (1997-05-25) |
Re: Error Recovery mag01@jvcam.northern.co.uk (Mark Gregory) (1997-05-27) |
Re: Error Recovery mcr@visi.com (Michael Roach) (1997-05-31) |
From: | Mark Gregory <mag01@jvcam.northern.co.uk> |
Newsgroups: | comp.compilers |
Date: | 27 May 1997 23:49:43 -0400 |
Organization: | Bell Northern Research |
References: | 97-05-153 97-05-293 |
Keywords: | parse, errors |
Thomas W. Christopher wrote:
>
> A fiducial symbol is a terminal symbol that ends or separates
> significant sections of program, e.g. ";", "end", "else".
Hello Thomas ...
I'm MarkAGr ( when I'm at home )
The LL(k) generator I'm building needs a little more than the error
recovery function ( "exit(-1);" ) that it already has ... and the
system you described is the closest to that that I have already
envisaged ... ie. when an error occurs ... the input stream is
absorbed until a "guardian production" ( instead of "fiducial symbol"
) is found. The parser then continues from a given production as if no
error has occured. This type of error recovery can ( relatively easily
) be generated automatically, by pushing the
"end-of-current-production" production onto a "guardian
production-stack" prior to any sub-production being entered, and
popped if the sub-production resolves successfully. ( However an
implementation is possible with no stack required for a
recursive-descent parser. ) Finding a way to incorporate this
guardian-production into the meta-syntax is another problem. My first
attempt will be in the production declatation ...
KEY
"..." ... literal
{ ... } . optional
; ....... expression terminator
blaBla .. sample of a sub-production
[n] ..... inline code
production := [0]
productionIdent { "<" guardianProductionIdent[1] ">" } ":="
productionBody ";"[2] ;
instead of the usual
production := productionIdent ":=" productionBody ";" ;
with the following code inserts ...
[0] int guardianPushed=0;
[1] pushGuardianFunction( theLexeme() );
guardianPushed=1;
[2] if( guardianPushed )
{
popGuardian();
}
and the inline error recovery function is no longer ...
exit( -1 );
but ...
if( errorCondition )
{
int (*guard)() = popGuardian();
guardianPushed = 0;
errorDisplayRoutine();
errorCount++;
while( !guard() )
{
disguardLexeme();
}
return VALID_PRODUCTION;
/* assuming that a production function returns production
recognition */
}
Please forgive the implementation specific details ... but sometimes it
help's me to clarify my thoughts, far more than prose ...
--
MarkAGr@aol.com
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.