Преглед изворни кода

Additions for non-correcting error recovery

ceriel пре 27 година
родитељ
комит
03de17911b

+ 6 - 0
lang/cem/cemcom.ansi/LLmessage.c

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

+ 4 - 0
lang/cem/cemcom.ansi/declar.g

@@ -145,6 +145,7 @@ single_decl_specifier /* non_empty */ (register struct decspecs *ds;)
 		ds->ds_typedef = 1;
 	}
 |
+	%erroneous
 	IDENTIFIER
 	{
 		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;
 		}
 	}
+|
+	%illegal
+	IDENTIFIER
 |
 	struct_or_union_specifier(&ds->ds_type)
 |

+ 3 - 2
lang/cem/cemcom.ansi/proto.make

@@ -12,7 +12,7 @@ SRC_DIR = \
 TABGEN=	$(UTIL_BIN)/tabgen
 LLGEN =	$(UTIL_BIN)/LLgen
 LLGENOPTIONS = \
-	-v
+	-n
 
 SRC_G =	$(SRC_DIR)/program.g $(SRC_DIR)/declar.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)/util.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)
 
 SRC_H = \
@@ -196,6 +196,7 @@ clean:
 LLfiles:	$(GFILES)
 		$(LLGEN) $(LLGENOPTIONS) $(GFILES)
 		@touch LLfiles
+		@if [ -f Lncor.c ] ; then : ; else touch Lncor.c ; fi
 
 hfiles:		Parameters $(SRC_DIR)/make.hfiles
 		$(SRC_DIR)/make.hfiles Parameters

+ 6 - 0
lang/cem/cemcom/LLmessage.c

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

+ 4 - 0
lang/cem/cemcom/declar.g

@@ -134,6 +134,7 @@ single_type_specifier(register struct decspecs *ds;):
 	%default TYPE_IDENTIFIER	/* this includes INT, CHAR, etc. */
 	{idf2type(dot.tk_idf, &ds->ds_type);}
 |
+	%erroneous
 	IDENTIFIER
 	{
 		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;
 		}
 	}
+|
+	%illegal
+	IDENTIFIER
 |
 	struct_or_union_specifier(&ds->ds_type)
 |

+ 2 - 0
lang/cem/cemcom/expression.g

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

+ 3 - 2
lang/cem/cemcom/proto.make

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

+ 10 - 2
lang/m2/comp/LLmessage.c

@@ -34,7 +34,9 @@ LLmessage(tk)
 		*/
 		register t_token *dotp = ˙
 
+#ifndef LLNONCORR
 		error("%s missing before %s", symbol2str(tk), symbol2str(dotp->tk_symb));
+#endif
 
 		aside = *dotp;
 
@@ -62,9 +64,15 @@ LLmessage(tk)
 		}
 	}
 	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;
 }
 

+ 7 - 2
lang/m2/comp/program.g

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

+ 3 - 2
lang/m2/comp/proto.make

@@ -12,7 +12,7 @@ SRC_DIR = \
 TABGEN=	$(UTIL_BIN)/tabgen
 LLGEN =	$(UTIL_BIN)/LLgen
 LLGENOPTIONS = \
-	-v
+	-n
 
 SRC_G =	$(SRC_DIR)/program.g $(SRC_DIR)/declar.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)/stab.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)
 
 SRC_H =	$(SRC_DIR)/LLlex.h $(SRC_DIR)/chk_expr.h $(SRC_DIR)/class.h \
@@ -118,6 +118,7 @@ clean:
 LLfiles:	$(GFILES)
 		$(LLGEN) $(LLGENOPTIONS) $(GFILES)
 		@touch LLfiles
+		@if [ -f Lncor.c ] ; then : ; else touch Lncor.c ; fi
 
 hfiles:		Parameters $(SRC_DIR)/make.hfiles
 		$(SRC_DIR)/make.hfiles Parameters

+ 2 - 1
lang/m2/comp/statement.g

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