瀏覽代碼

Patched imprecise error positions within ARM assembler

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7382 8c9fc860-2736-0410-a75d-ab315db34111
felixf 7 年之前
父節點
當前提交
063e828e26

+ 1 - 1
source/FoxARMBackend.Mod

@@ -2646,7 +2646,7 @@ TYPE
 			END;
 
 			NEW(assembler, diagnostics);
-			scanner := Scanner.NewAssemblerScanner(module.moduleName(*module.module.sourceName*), reader, LONGINT(irInstruction.op1.intValue) (* ? *), diagnostics);
+			NEW(scanner, module.moduleName(*module.module.sourceName*), reader, irInstruction.textPosition, diagnostics);
 			scanner.useLineNumbers := Compiler.UseLineNumbers IN backend.flags;
 			assembler.InlineAssemble(scanner, in, scope, module);
 			error := error OR assembler.error

+ 2 - 2
source/FoxAssembler.Mod

@@ -906,7 +906,7 @@ TYPE
 	VAR scanner: Scanner.AssemblerScanner;  diagnostics: Diagnostics.StreamDiagnostics; assembler: Assembler;
 	BEGIN
 		NEW(diagnostics,context.out);
-		NEW(scanner,"command",context.arg,0,diagnostics);
+		scanner := Scanner.NewAssemblerScanner("command",context.arg,0,diagnostics);
 		NEW(assembler,diagnostics);
 		assembler.Text(scanner);
 		(*
@@ -918,7 +918,7 @@ TYPE
 	VAR scanner: Scanner.AssemblerScanner;  diagnostics: Diagnostics.StreamDiagnostics; symbol: Scanner.Symbol;
 	BEGIN
 		NEW(diagnostics,context.out);
-		NEW(scanner,"command",context.arg,0,diagnostics);
+		scanner := Scanner.NewAssemblerScanner("command",context.arg,0,diagnostics);
 		WHILE scanner.GetNextSymbol(symbol) & (symbol.token # Scanner.EndOfText)  DO
 			Scanner.OutSymbol(context.out, symbol); context.out.Ln;
 		END;

+ 1 - 1
source/FoxCompiler.Mod

@@ -54,7 +54,7 @@ TYPE
 			diagnostics.Error (filename, Diagnostics.Invalid, Diagnostics.Invalid, "failed to open");
 		ELSE
 
-			NEW(scanner, filename, reader,0, diagnostics);
+			scanner := Scanner.NewScanner(filename, reader, 0, diagnostics);
 			NEW(parser, scanner, diagnostics);
 
 			REPEAT (* WHILE parser.Peek(Scanner.Identifier) DO*)

+ 1 - 1
source/FoxDisassembler.Mod

@@ -177,7 +177,7 @@ TYPE
 			first := NIL; last := NIL;
 			IF file = NIL THEN RETURN NIL END;
 			NEW(reader, file, 0);
-			NEW(scanner, "", reader,0,  NIL);
+			scanner := Scanner.NewAssemblerScanner("",reader,0,NIL);
 			b := scanner.GetNextSymbol(symbol);
 			REPEAT
 				block := ParseLine();

+ 1 - 1
source/FoxIntermediateParser.Mod

@@ -593,7 +593,7 @@ TYPE
 		assemblerScanner: Scanner.AssemblerScanner;
 		intermediateCodeParser: IntermediateCodeParser;
 	BEGIN
-		NEW(assemblerScanner, "", reader, 0, diagnostics);
+		assemblerScanner := Scanner.NewAssemblerScanner("",reader,0,diagnostics); 
 		NEW(intermediateCodeParser, diagnostics, module.system);
 		RETURN intermediateCodeParser.ParseModuleContent(assemblerScanner, module)
 	END ParseReader;

+ 1 - 1
source/FoxInterpreter.Mod

@@ -815,7 +815,7 @@ TYPE
 			VAR str: Strings.String; reader: Streams.Reader; done: BOOLEAN;
 			BEGIN
 				reader := expMaker.GetReader();
-				NEW(scanner, "", reader, 0, NIL);
+				scanner := Scanner.NewScanner("", reader, 0, NIL);
 				NEW(parser, scanner, NIL);
 				REPEAT
 					error := FALSE;

+ 17 - 10
source/FoxScanner.Mod

@@ -307,7 +307,7 @@ TYPE
 			position: reference position (offset) of the input stream , for error output
 			diagnostics: error output object
 		*)
-		PROCEDURE & InitializeScanner*( CONST source: ARRAY OF CHAR; reader: Streams.Reader; position: LONGINT; diagnostics: Diagnostics.Diagnostics );
+		PROCEDURE & InitializeScanner*( CONST source: ARRAY OF CHAR; reader: Streams.Reader; pos: Position; diagnostics: Diagnostics.Diagnostics );
 		BEGIN
 			NEW(stringMaker,1024);
 			stringWriter := stringMaker.GetWriter();
@@ -319,15 +319,14 @@ TYPE
 			ch := " ";
 			case := Unknown;
 			firstIdentifier := TRUE;
+			SELF.position := pos; 
+			DEC(position.start, 1); (* one symbol lookahead *)
 			IF reader = NIL THEN ch := EOT ELSE 	GetNextCharacter END;
 			IF Trace THEN D.Str( "New scanner  " );   D.Ln;  END;
-			SELF.position.start := position;
-			SELF.position.line := 1;
-			SELF.position.linepos := 0;
 			IF source = "" THEN SELF.position.reader := reader END; 
 			useLineNumbers := FALSE;
 		END InitializeScanner;
-
+		
 		PROCEDURE ResetCase*; (*! needs a better naming ! *)
 		BEGIN
 			firstIdentifier := TRUE; case := Unknown;
@@ -1001,7 +1000,7 @@ TYPE
 	VAR
 		startContext-: Context;
 
-		PROCEDURE &InitAssemblerScanner*( CONST source: ARRAY OF CHAR; reader: Streams.Reader; position: LONGINT; diagnostics: Diagnostics.Diagnostics );
+		PROCEDURE &InitAssemblerScanner*( CONST source: ARRAY OF CHAR; reader: Streams.Reader; position: Position; diagnostics: Diagnostics.Diagnostics );
 		BEGIN
 			InitializeScanner(source,reader,position,diagnostics);
 			GetContext(startContext);
@@ -1190,15 +1189,23 @@ TYPE
 
 	(** return a new scanner on a stream, error output via diagnostics  **)
 	PROCEDURE NewScanner*( CONST source: ARRAY OF CHAR; reader: Streams.Reader; position: LONGINT; diagnostics: Diagnostics.Diagnostics ): Scanner;
-	VAR s: Scanner;
+	VAR s: Scanner; pos: Position; 
 	BEGIN
-		NEW( s, source, reader, position, diagnostics );  RETURN s;
+		pos.start := position;
+		pos.end := position;
+		pos.line := 1;
+		pos.linepos := 0;
+		NEW( s, source, reader, pos, diagnostics );  RETURN s;
 	END NewScanner;
 
 	PROCEDURE NewAssemblerScanner*( CONST source: ARRAY OF CHAR; reader: Streams.Reader; position: LONGINT; diagnostics: Diagnostics.Diagnostics ): AssemblerScanner;
-	VAR s: AssemblerScanner;
+	VAR s: AssemblerScanner;pos: Position; 
 	BEGIN
-		NEW( s, source, reader, position, diagnostics );  RETURN s;
+		pos.start := position;
+		pos.end := position;
+		pos.line := 1;
+		pos.linepos := 0;
+		NEW( s, source, reader, pos, diagnostics );  RETURN s;
 	END NewAssemblerScanner;
 
 	PROCEDURE SymbolToString*(CONST symbol: Symbol; case: LONGINT; VAR str: ARRAY OF CHAR);

+ 1 - 1
source/InterpreterShell.Mod

@@ -802,7 +802,7 @@ TYPE
 				context.out.Ln;
 				context.out.String(">");
 				context.out.Update;
-				NEW(scanner,"", r, 0, diagnostics);
+				scanner := Scanner.NewScanner("", r, 0, diagnostics);
 				scanner.SetCase(Scanner.Lowercase);
 				NEW(parser, scanner, diagnostics); (* silent *) 
 				parser.SetLax;