浏览代码

Improved error reporting

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6979 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 年之前
父节点
当前提交
e40aabefa5
共有 4 个文件被更改,包括 28 次插入22 次删除
  1. 22 1
      source/FoxBasic.Mod
  2. 4 2
      source/FoxParser.Mod
  3. 1 18
      source/FoxScanner.Mod
  4. 1 1
      source/PET.Mod

+ 22 - 1
source/FoxBasic.Mod

@@ -1762,11 +1762,32 @@ VAR
 	
 	(* error message with code *)
 	PROCEDURE ErrorC*(diagnostics: Diagnostics.Diagnostics; CONST source: ARRAY OF CHAR; pos: Position; code: ErrorCode; CONST msg: ARRAY OF CHAR);
-	VAR message: ARRAY 256 OF CHAR;
+	VAR message,err: ARRAY 512 OF CHAR; ch: CHAR; b: BOOLEAN; oldpos: LONGINT;
+		file: Files.File; reader: Files.Reader;
 	BEGIN
 		IF diagnostics # NIL THEN
 			MakeMessage(pos, code, msg,message);
+			IF (source # "") & (pos.linepos >= 0) THEN
+				err[0] := 0AX;
+				err[1] := 0X;
+				file := Files.Old(source);
+				IF file # NIL THEN 
+					NEW(reader, file, pos.linepos); 
+					reader.SetPos(pos.linepos);
+					reader.Char(ch);
+					WHILE (ch # 0X) & (ch # 0AX) DO
+						Strings.AppendChar(err, ch);
+						IF reader.Pos() = pos.start THEN
+							Strings.Append(err,"(*!*)");
+						END;
+						reader.Char(ch);
+					END;
+					Strings.Append(message, err);
+					(*diagnostics.Error(source, Diagnostics.Invalid, Diagnostics.Invalid, err);*)
+				END;
+			END;
 			diagnostics.Error(source, pos.start, code, message);
+			
 		END;
 	END ErrorC;
 

+ 4 - 2
source/FoxParser.Mod

@@ -683,10 +683,12 @@ TYPE
 					designator := SyntaxTree.NewParameterDesignator( position,designator,expressionList);
 				ELSIF OptionalB( Scanner.Period ) THEN
 					IF ~Optional(Scanner.Identifier) THEN (* make sure symbol is read *) END;
+					position := symbol.position;
 					CASE symbol.identifierString[0] OF
 						"a".."z", "A" .. "Z":
 					(*IF Peek(Scanner.Size) (* special rule: support for SYSTEM.SIZE *) THEN*)
-						identifier := symbol.identifier; NextSymbol;
+						identifier := symbol.identifier; 
+						NextSymbol;
 					ELSE
 						identifier := Identifier(position);
 					END;
@@ -2132,8 +2134,8 @@ TYPE
 			IF Trace THEN S( "ImportList" ) END;
 			(* import symbol already consumed *)
 			REPEAT
-				position := symbol.position;
 				alias := Identifier(idPosition);
+				position := symbol.position;
 				IF alias # SyntaxTree.invalidIdentifier THEN
 					IF Optional( Scanner.Becomes ) THEN name := Identifier(idPosition) ELSE name := alias;  END;
 					import := SyntaxTree.NewImport( position, alias, name, TRUE );

+ 1 - 18
source/FoxScanner.Mod

@@ -355,7 +355,7 @@ TYPE
 		PROCEDURE GetNextCharacter*;
 		BEGIN
 			reader.Char(ch); INC(position.start);
-			IF ch = LF THEN INC(position.line); position.linepos := position.start END;
+			IF ch = LF THEN INC(position.line); position.linepos := position.start+1 END;
 			(*
 			(* not necessary, as Streams returns 0X if reading failed, but in case Streams.Reader.Char is modified ...  *)
 			IF reader.res # Streams.Ok THEN ch := EOT END;
@@ -805,7 +805,6 @@ TYPE
 			ASSERT(case # Unknown);
 			stringMaker.Clear;
 			startPos := symbol.position.end;
-			IF useLineNumbers THEN startPos := position.line END;
 			s := symbol.token;
 			WHILE (s # EndOfText) & (s # End) & (s # With) DO
 				symbol.position := position;
@@ -854,14 +853,6 @@ TYPE
 		BEGIN
 			SkipBlanks;
 			symbol.position := position;
-			(*
-			IF useLineNumbers THEN
-				symbol.position.start := position.line+1; 
-			ELSE
-				symbol.position.start := position.start
-			END;
-			symbol.position.line := position.line;
-			*)
 			stringMaker.Clear;
 			CASE ch OF  (* ch > " " *)
 			EOT: s := EndOfText
@@ -1135,14 +1126,6 @@ TYPE
 			REPEAT
 				SkipBlanks;
 				symbol.position := position;
-				(*
-				IF useLineNumbers THEN
-					symbol.position.start := position.line+1; 
-				ELSE
-					symbol.position.start := position.start;
-				END;
-				symbol.position.line := position.line;
-				*)
 				CASE ch OF  (* ch > ' ' *)
 				| EOT: 	s := EndOfText;
 				| DoubleQuote:

+ 1 - 1
source/PET.Mod

@@ -761,7 +761,7 @@ TYPE
 				compiler := CompilerInterface.GetCompilerByName(compilerSettings.name);
 			END;
 			IF (compiler # NIL) THEN
-				compiler.CompileText(editor.text, filename, 0, pc, options, tw, diagnostics, errors);
+				compiler.CompileText(editor.text, "" (* filename*) , 0, pc, options, tw, diagnostics, errors);
 			ELSE
 				tw.String("No compiler available for file '"); tw.String(filename); tw.String("'");
 				logPanel.visible.Set(TRUE);