Additions for non-correcting error recovery

This commit is contained in:
ceriel 1997-02-21 17:11:04 +00:00
parent 8ea5d257c4
commit 99ac23b4b4
11 changed files with 50 additions and 11 deletions

View file

@ -19,11 +19,17 @@ LLmessage(tk) {
error("end of file expected"); error("end of file expected");
} }
else if (tk) { else if (tk) {
#ifndef LLNONCORR
error("%s missing before %s", symbol2str(tk), symbol2str(DOT)); error("%s missing before %s", symbol2str(tk), symbol2str(DOT));
#endif
insert_token(tk); insert_token(tk);
} }
else { else {
#ifndef LLNONCORR
error("%s deleted", symbol2str(DOT)); error("%s deleted", symbol2str(DOT));
#else
error("%s not expected", symbol2str(DOT));
#endif
} }
tk_nmb_at_last_syn_err = token_nmb; tk_nmb_at_last_syn_err = token_nmb;
} }

View file

@ -145,6 +145,7 @@ single_decl_specifier /* non_empty */ (register struct decspecs *ds;)
ds->ds_typedef = 1; ds->ds_typedef = 1;
} }
| |
%erroneous
IDENTIFIER IDENTIFIER
{ {
error("%s is not a type identifier", dot.tk_idf->id_text); error("%s is not a type identifier", dot.tk_idf->id_text);
@ -154,6 +155,9 @@ single_decl_specifier /* non_empty */ (register struct decspecs *ds;)
dot.tk_idf->id_def->df_sc = TYPEDEF; dot.tk_idf->id_def->df_sc = TYPEDEF;
} }
} }
|
%illegal
IDENTIFIER
| |
struct_or_union_specifier(&ds->ds_type) struct_or_union_specifier(&ds->ds_type)
| |

View file

@ -12,7 +12,7 @@ SRC_DIR = \
TABGEN= $(UTIL_BIN)/tabgen TABGEN= $(UTIL_BIN)/tabgen
LLGEN = $(UTIL_BIN)/LLgen LLGEN = $(UTIL_BIN)/LLgen
LLGENOPTIONS = \ LLGENOPTIONS = \
-v -n
SRC_G = $(SRC_DIR)/program.g $(SRC_DIR)/declar.g \ SRC_G = $(SRC_DIR)/program.g $(SRC_DIR)/declar.g \
$(SRC_DIR)/expression.g $(SRC_DIR)/statement.g $(SRC_DIR)/ival.g $(SRC_DIR)/expression.g $(SRC_DIR)/statement.g $(SRC_DIR)/ival.g
@ -64,7 +64,7 @@ SRC_C = \
$(SRC_DIR)/type.c \ $(SRC_DIR)/type.c \
$(SRC_DIR)/util.c $(SRC_DIR)/util.c
GEN_C = tokenfile.c program.c declar.c expression.c statement.c ival.c \ GEN_C = tokenfile.c program.c declar.c expression.c statement.c ival.c \
symbol2str.c char.c Lpars.c next.c symbol2str.c char.c Lpars.c next.c Lncor.c
CFILES= $(SRC_C) $(GEN_C) CFILES= $(SRC_C) $(GEN_C)
SRC_H = \ SRC_H = \
@ -196,6 +196,7 @@ clean:
LLfiles: $(GFILES) LLfiles: $(GFILES)
$(LLGEN) $(LLGENOPTIONS) $(GFILES) $(LLGEN) $(LLGENOPTIONS) $(GFILES)
@touch LLfiles @touch LLfiles
@if [ -f Lncor.c ] ; then : ; else touch Lncor.c ; fi
hfiles: Parameters $(SRC_DIR)/make.hfiles hfiles: Parameters $(SRC_DIR)/make.hfiles
$(SRC_DIR)/make.hfiles Parameters $(SRC_DIR)/make.hfiles Parameters

View file

@ -20,11 +20,17 @@ LLmessage(tk) {
error("end of file expected"); error("end of file expected");
} }
else if (tk) { else if (tk) {
#ifndef LLNONCORR
error("%s missing before %s", symbol2str(tk), symbol2str(DOT)); error("%s missing before %s", symbol2str(tk), symbol2str(DOT));
#endif
insert_token(tk); insert_token(tk);
} }
else { else {
#ifndef LLNONCORR
error("%s deleted", symbol2str(DOT)); error("%s deleted", symbol2str(DOT));
#else
error("%s not expected", symbol2str(DOT));
#endif
} }
tk_nmb_at_last_syn_err = token_nmb; tk_nmb_at_last_syn_err = token_nmb;
} }

View file

@ -134,6 +134,7 @@ single_type_specifier(register struct decspecs *ds;):
%default TYPE_IDENTIFIER /* this includes INT, CHAR, etc. */ %default TYPE_IDENTIFIER /* this includes INT, CHAR, etc. */
{idf2type(dot.tk_idf, &ds->ds_type);} {idf2type(dot.tk_idf, &ds->ds_type);}
| |
%erroneous
IDENTIFIER IDENTIFIER
{ {
error("%s is not a type identifier", dot.tk_idf->id_text); error("%s is not a type identifier", dot.tk_idf->id_text);
@ -143,6 +144,9 @@ single_type_specifier(register struct decspecs *ds;):
dot.tk_idf->id_def->df_sc = TYPEDEF; dot.tk_idf->id_def->df_sc = TYPEDEF;
} }
} }
|
%illegal
IDENTIFIER
| |
struct_or_union_specifier(&ds->ds_type) struct_or_union_specifier(&ds->ds_type)
| |

View file

@ -23,6 +23,8 @@ extern struct expr *intexpr();
primary(register struct expr **expp;) : primary(register struct expr **expp;) :
IDENTIFIER IDENTIFIER
{dot2expr(expp);} {dot2expr(expp);}
|
%illegal TYPE_IDENTIFIER
| |
constant(expp) constant(expp)
| |

View file

@ -12,7 +12,7 @@ SRC_DIR = \
TABGEN= $(UTIL_BIN)/tabgen TABGEN= $(UTIL_BIN)/tabgen
LLGEN = $(UTIL_BIN)/LLgen LLGEN = $(UTIL_BIN)/LLgen
LLGENOPTIONS = \ LLGENOPTIONS = \
-v -n
SRC_G = $(SRC_DIR)/program.g $(SRC_DIR)/declar.g \ SRC_G = $(SRC_DIR)/program.g $(SRC_DIR)/declar.g \
$(SRC_DIR)/expression.g $(SRC_DIR)/statement.g $(SRC_DIR)/ival.g $(SRC_DIR)/expression.g $(SRC_DIR)/statement.g $(SRC_DIR)/ival.g
@ -64,7 +64,7 @@ SRC_C = \
$(SRC_DIR)/stab.c $(SRC_DIR)/stab.c
GEN_C = tokenfile.c program.c declar.c expression.c statement.c ival.c \ GEN_C = tokenfile.c program.c declar.c expression.c statement.c ival.c \
symbol2str.c char.c Lpars.c next.c symbol2str.c char.c Lpars.c next.c Lncor.c
CFILES= $(SRC_C) $(GEN_C) CFILES= $(SRC_C) $(GEN_C)
SRC_H = \ SRC_H = \
@ -193,6 +193,7 @@ clean:
LLfiles: $(GFILES) LLfiles: $(GFILES)
$(LLGEN) $(LLGENOPTIONS) $(GFILES) $(LLGEN) $(LLGENOPTIONS) $(GFILES)
@touch LLfiles @touch LLfiles
@if [ -f Lncor.c ] ; then : ; else touch Lncor.c ; fi
hfiles: Parameters $(SRC_DIR)/make.hfiles hfiles: Parameters $(SRC_DIR)/make.hfiles
$(SRC_DIR)/make.hfiles Parameters $(SRC_DIR)/make.hfiles Parameters

View file

@ -34,7 +34,9 @@ LLmessage(tk)
*/ */
register t_token *dotp = ˙ register t_token *dotp = ˙
#ifndef LLNONCORR
error("%s missing before %s", symbol2str(tk), symbol2str(dotp->tk_symb)); error("%s missing before %s", symbol2str(tk), symbol2str(dotp->tk_symb));
#endif
aside = *dotp; aside = *dotp;
@ -62,9 +64,15 @@ LLmessage(tk)
} }
} }
else if (tk < 0) { else if (tk < 0) {
error("garbage at end of program"); error("end of file expected");
}
else {
#ifndef LLNONCORR
error("%s deleted", symbol2str(dot.tk_symb));
#else
error("%s not expected", symbol2str(dot.tk_symb));
#endif
} }
else error("%s deleted", symbol2str(dot.tk_symb));
tk_nmb_at_last_syn_err = token_nmb; tk_nmb_at_last_syn_err = token_nmb;
} }

View file

@ -109,7 +109,9 @@ import(int local;)
name, otherwise the names in the import list are module names. name, otherwise the names in the import list are module names.
*/ */
[ FROM [ FROM
IDENT { FromId = dot2leaf(Name); IDENT
%substart DefinitionModule;
{ FromId = dot2leaf(Name);
if (local) { if (local) {
df = lookfor(FromId,enclosing(CurrVis),0,D_USED); df = lookfor(FromId,enclosing(CurrVis),0,D_USED);
} }
@ -117,6 +119,7 @@ import(int local;)
} }
]? ]?
IMPORT IdentList(&ImportList) ';' IMPORT IdentList(&ImportList) ';'
%substart DefinitionModule;
{ if (FromId) { { if (FromId) {
EnterFromImportList(ImportList, df, FromId); EnterFromImportList(ImportList, df, FromId);
} }
@ -226,7 +229,9 @@ ProgramModule
register t_def *df; register t_def *df;
} : } :
MODULE MODULE
IDENT { IDENT
%substart DefinitionModule;
{
if (state == IMPLEMENTATION) { if (state == IMPLEMENTATION) {
int len = strlen(dot.TOK_IDF->id_text); int len = strlen(dot.TOK_IDF->id_text);

View file

@ -12,7 +12,7 @@ SRC_DIR = \
TABGEN= $(UTIL_BIN)/tabgen TABGEN= $(UTIL_BIN)/tabgen
LLGEN = $(UTIL_BIN)/LLgen LLGEN = $(UTIL_BIN)/LLgen
LLGENOPTIONS = \ LLGENOPTIONS = \
-v -n
SRC_G = $(SRC_DIR)/program.g $(SRC_DIR)/declar.g \ SRC_G = $(SRC_DIR)/program.g $(SRC_DIR)/declar.g \
$(SRC_DIR)/expression.g $(SRC_DIR)/statement.g $(SRC_DIR)/expression.g $(SRC_DIR)/statement.g
@ -28,7 +28,7 @@ SRC_C = $(SRC_DIR)/LLlex.c $(SRC_DIR)/LLmessage.c $(SRC_DIR)/error.c \
$(SRC_DIR)/desig.c $(SRC_DIR)/code.c $(SRC_DIR)/lookup.c \ $(SRC_DIR)/desig.c $(SRC_DIR)/code.c $(SRC_DIR)/lookup.c \
$(SRC_DIR)/stab.c $(SRC_DIR)/stab.c
GEN_C = tokenfile.c program.c declar.c expression.c statement.c \ GEN_C = tokenfile.c program.c declar.c expression.c statement.c \
symbol2str.c char.c Lpars.c casestat.c tmpvar.c scope.c next.c symbol2str.c char.c Lpars.c Lncor.c casestat.c tmpvar.c scope.c next.c
CFILES= $(SRC_C) $(GEN_C) CFILES= $(SRC_C) $(GEN_C)
SRC_H = $(SRC_DIR)/LLlex.h $(SRC_DIR)/chk_expr.h $(SRC_DIR)/class.h \ SRC_H = $(SRC_DIR)/LLlex.h $(SRC_DIR)/chk_expr.h $(SRC_DIR)/class.h \
@ -118,6 +118,7 @@ clean:
LLfiles: $(GFILES) LLfiles: $(GFILES)
$(LLGEN) $(LLGENOPTIONS) $(GFILES) $(LLGEN) $(LLGENOPTIONS) $(GFILES)
@touch LLfiles @touch LLfiles
@if [ -f Lncor.c ] ; then : ; else touch Lncor.c ; fi
hfiles: Parameters $(SRC_DIR)/make.hfiles hfiles: Parameters $(SRC_DIR)/make.hfiles
$(SRC_DIR)/make.hfiles Parameters $(SRC_DIR)/make.hfiles Parameters

View file

@ -43,7 +43,8 @@ statement(register t_node **pnd;)
ActualParameters(&(nd->nd_RIGHT))? ActualParameters(&(nd->nd_RIGHT))?
| |
[ BECOMES [ BECOMES
| '=' { error("':=' expected instead of '='"); | %erroneous '='
{ error("':=' expected instead of '='");
DOT = BECOMES; DOT = BECOMES;
} }
] ]