Browse Source

Error line number support for course

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6952 8c9fc860-2736-0410-a75d-ab315db34111
felixf 8 years ago
parent
commit
ab967b76f2
4 changed files with 31 additions and 2 deletions
  1. 5 0
      source/FoxCompiler.Mod
  2. 2 0
      source/FoxFrontend.Mod
  3. 1 0
      source/FoxOberonFrontend.Mod
  4. 23 2
      source/FoxScanner.Mod

+ 5 - 0
source/FoxCompiler.Mod

@@ -286,6 +286,7 @@ TYPE
 		
 		options.Add("p","platform",Options.String);
 		options.Add(0X,"showOptions",Options.Flag);
+		options.Add("l","lineNumbers", Options.Flag);
 		
 		options.Add(0X,"print",Options.Flag);
 		options.Add(0X,"Print",Options.Flag);
@@ -428,6 +429,10 @@ TYPE
 			IF compilerOptions.objectFile # NIL THEN compilerOptions.objectFile.GetOptions(options) END;
 			IF compilerOptions.documentation # NIL THEN compilerOptions.documentation.GetOptions(options) END;
 		END;
+
+		IF (compilerOptions.frontend # NIL) THEN
+			compilerOptions.frontend.lineNumbers := options.GetFlag("lineNumbers");
+		END;
 		
 		IF options.GetFlag("showOptions") THEN options.Show(error) END;
 		RETURN result

+ 2 - 0
source/FoxFrontend.Mod

@@ -7,6 +7,8 @@ TYPE
 
 	Frontend* = OBJECT
 	VAR		
+		lineNumbers*: BOOLEAN;
+		
 		PROCEDURE & InitFrontEnd*;
 		BEGIN
 			Initialize(NIL, NIL, "", 0);

+ 1 - 0
source/FoxOberonFrontend.Mod

@@ -14,6 +14,7 @@ TYPE
 		BEGIN
 			Initialize^(diagnostics, reader, fileName, pos);
 			scanner := Scanner.NewScanner(fileName, reader, pos, diagnostics);
+			scanner.useLineNumbers := lineNumbers;
 			parser := Parser.NewParser( scanner, diagnostics );
 		END Initialize;
 		

+ 23 - 2
source/FoxScanner.Mod

@@ -294,6 +294,8 @@ TYPE
 		case-: LONGINT;
 		stringWriter: Streams.Writer;
 		stringMaker: StringMaker;
+	
+		useLineNumbers*: BOOLEAN;
 
 		(*
 			source: name of the source code for reference in error outputs
@@ -317,6 +319,7 @@ TYPE
 			IF Trace THEN D.Str( "New scanner  " );   D.Ln;  END;
 			SELF.position := position;
 			line := 0;
+			useLineNumbers := TRUE;
 		END InitializeScanner;
 
 		PROCEDURE ResetCase*; (*! needs a better naming ! *)
@@ -333,7 +336,11 @@ TYPE
 		PROCEDURE ErrorS(CONST msg: ARRAY OF CHAR);
 		BEGIN
 			IF diagnostics # NIL THEN
+				IF useLineNumbers THEN
+				diagnostics.Error(source^, line+1, Diagnostics.Invalid, msg)
+				ELSE
 				diagnostics.Error(source^, position, Diagnostics.Invalid, msg)
+				END;
 			END;
 			error := TRUE;
 		END ErrorS;
@@ -344,7 +351,11 @@ TYPE
 		BEGIN
 			IF diagnostics # NIL THEN
 				Basic.GetErrorMessage(code,"",errorMessage);
+				IF useLineNumbers THEN
+				diagnostics.Error(source^, line+1, code, errorMessage)
+				ELSE
 				diagnostics.Error(source^, position, code, errorMessage)
+				END;
 			END;
 			error := TRUE;
 		END Error;
@@ -850,7 +861,12 @@ TYPE
 		VAR s,token: LONGINT;
 		BEGIN
 			SkipBlanks;
-			symbol.start := position; symbol.line := line;
+			IF useLineNumbers THEN
+				symbol.start := line+1; 
+			ELSE
+				symbol.start := position
+			END;
+			symbol.line := line;
 			stringMaker.Clear;
 			CASE ch OF  (* ch > " " *)
 			EOT: s := EndOfText
@@ -1122,7 +1138,12 @@ TYPE
 		BEGIN
 			REPEAT
 				SkipBlanks;
-				symbol.start := position; symbol.line := line;
+				IF useLineNumbers THEN
+					symbol.start := line+1; 
+				ELSE
+					symbol.start := position
+				END;
+				symbol.line := line;
 				CASE ch OF  (* ch > ' ' *)
 				| EOT: 	s := EndOfText;
 				| DoubleQuote: