Forráskód Böngészése

Added basic support for parsing in stages which ignores unknown options but still diagnoses other errors

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@7689 8c9fc860-2736-0410-a75d-ab315db34111
negelef 7 éve
szülő
commit
c62b98c59a

+ 3 - 3
source/FoxCompiler.Mod

@@ -306,15 +306,15 @@ TYPE
 		options.Add(0X,"cooperative", Options.Flag);
 
 		position := input.Pos();
-		parsed := options.Parse(input, error);
+		parsed := options.ParseStaged(input, error);
 		IF options.GetString("platform", name) OR GetDefaultPlatform(name) THEN
 			defaults := platforms.Get(name);
 			IF defaults = NIL THEN 	
 				error.String("Unknown platform"); error.Ln 
 			ELSE
-				parsed := options.Parse(defaults, error) & parsed;
+				parsed := options.ParseStaged(defaults, error) & parsed;
 				input.SetPos(position);
-				parsed := options.Parse(input, error) & parsed; (* reparse overwrites *)
+				parsed := options.ParseStaged(input, error) & parsed; (* reparse overwrites *)
 			END;
 		ELSE 
 			defaults := NIL;

+ 2 - 2
source/FoxIntermediateLinker.Mod

@@ -1201,7 +1201,7 @@ TYPE
 		options.Add(0X, "targetFile", Options.String);
 
 		position := input.Pos();
-		parsed := options.Parse(input, context.error);
+		parsed := options.ParseStaged(input, context.error);
 
 		IF options.GetString("b", name) THEN
 			IF name = "" THEN defaultBackend := NIL
@@ -1387,7 +1387,7 @@ TYPE
 		options.Add(0X, "extension", Options.String);
 
 		position := input.Pos();
-		parsed := options.Parse(input, context.error);
+		parsed := options.ParseStaged(input, context.error);
 
 		IF options.GetString("b", name) THEN
 			IF name = "" THEN defaultBackend := NIL

+ 16 - 4
source/Options.Mod

@@ -85,6 +85,7 @@ TYPE
 		arg : Streams.Reader;
 		error : Streams.Writer;
 		setError : BOOLEAN;
+		flagUnknownOptions : BOOLEAN;
 
 		timestamp : LONGINT;
 
@@ -254,23 +255,34 @@ TYPE
 			The actual options will be set as side effect when parsing.
 		*)
 		PROCEDURE Parse*(arg : Streams.Reader; error : Streams.Writer) : BOOLEAN;
+		BEGIN
+			RETURN ParseWithOptions(arg, error, TRUE);
+		END Parse;
+
+		PROCEDURE ParseStaged*(arg : Streams.Reader; error : Streams.Writer) : BOOLEAN;
+		BEGIN
+			RETURN ParseWithOptions(arg, error, FALSE);
+		END ParseStaged;
+
+		PROCEDURE ParseWithOptions(arg : Streams.Reader; error : Streams.Writer; flagUnknownOptions : BOOLEAN) : BOOLEAN;
 		VAR succeeded : BOOLEAN;
 		BEGIN {EXCLUSIVE}
 			ASSERT(arg # NIL);
 			SELF.arg := arg; SELF.error := error;
+			SELF.flagUnknownOptions := flagUnknownOptions;
 			INC(timestamp);
 			arg.SkipWhitespace;
 			setError := FALSE;
 			succeeded := ParseOptions() & ~setError;
 			IF ~succeeded & (error # NIL) THEN error.Update; END;
 			RETURN succeeded;
-		END Parse;
+		END ParseWithOptions;
 
 		PROCEDURE ParseString*(CONST string : ARRAY OF CHAR; error : Streams.Writer) : BOOLEAN;
 		VAR reader : Streams.StringReader;
 		BEGIN
 			NEW(reader, LEN(string)); reader.SetRaw(string, 0, LEN(string));
-			RETURN Parse(reader, error);
+			RETURN ParseWithOptions(reader, error, TRUE);
 		END ParseString;
 
 		(* Options = [ "-" Option [ WhiteSpace { "-" Option} ] ] *)
@@ -481,7 +493,7 @@ TYPE
 					error.String("Option "); ShowOption(ch, name);
 					error.String(" set multiple times"); error.Ln;
 				END;
-			ELSIF (error # NIL) THEN
+			ELSIF (error # NIL) & flagUnknownOptions THEN
 				error.String("Unknown option "); ShowOption(ch, name); error.Ln;
 			END;
 			setError := TRUE;
@@ -522,7 +534,7 @@ TYPE
 					error.String("Option "); ShowOption(ch, name);
 					error.String(" set multiple times"); error.Ln;
 				END;
-			ELSIF (error # NIL) THEN
+			ELSIF (error # NIL) & flagUnknownOptions THEN
 				error.String("Unknown option "); ShowOption(ch, name); error.Ln;
 			END;
 			setError := TRUE;

+ 2 - 2
source/StaticLinker.Mod

@@ -992,13 +992,13 @@ BEGIN
 	options.Add(0X,"exports", Options.String);
 
 	position := context.arg.Pos();
-	parsed := options.Parse(context.arg, context.error);
+	parsed := options.ParseStaged(context.arg, context.error);
 	IF options.GetString("platform", name) THEN
 		reader := defaults.Get(name);
 		IF reader = NIL THEN 
 			context.error.String("Unknown platform"); context.error.Ln 
 		ELSE
-			parsed := options.Parse(reader, context.error) & parsed;
+			parsed := options.ParseStaged(reader, context.error) & parsed;
 			context.arg.SetPos(position);
 			context.arg.SetPos(position);
 			parsed := options.Parse(context.arg, context.error) & parsed; (* reparse overwrites *)