Additions for non-correcting error recovery
This commit is contained in:
parent
8ea5d257c4
commit
99ac23b4b4
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
Loading…
Reference in a new issue