public void ValidateBinaryParsing() { string [] code = new [] { " B'1010101111'", " b\"111\"", " B'121'" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.INTEGER); IntegerToken intToken = (IntegerToken)token; Assert.AreEqual(intToken.Value, 687); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.INTEGER); intToken = (IntegerToken)token; Assert.AreEqual(intToken.Value, 7); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); ls.GetToken(); Assert.IsTrue(messages.ErrorCount > 0); Assert.IsTrue(messages[0].Line == 3); Assert.IsTrue(messages[0].Code == MessageCode.BADNUMBERFORMAT); }
public void ArrayVerifyArraySyntax() { string [] code = new [] { " FUNCTION ITEST", " INTEGER A(2)", " A(1) = 45", " A(2) = 78", " RETURN A(1) + A(2)", " END" }; Compiler comp = Helper.HelperCompile(code, new FortranOptions()); Helper.HelperRunInteger(comp, "ITEST", 123); }
public void ParseConstantDivisionByZero() { string [] code = new [] { " FUNCTION TEST", " INTEGER I", " I = 10/0", " RETURN I", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(1, comp.Messages.Count); Assert.AreEqual(MessageCode.DIVISIONBYZERO, comp.Messages[0].Code); Assert.AreEqual(3, comp.Messages[0].Line); }
public void ArrayAssumedSizeArrays() { string [] code = new [] { " FUNCTION TEST", " REAL ARRAY(2)", " ARRAY(1) = 45", " ARRAY(2) = 73", " TEST=FOO(ARRAY)", " END", " FUNCTION FOO(R)", " REAL R(*)", " RETURN R(1)+R(2)", " END" }; Compiler comp = Helper.HelperCompile(code, new FortranOptions()); Helper.HelperRunFloat(comp, "TEST", 118); }
public void ParseVerifyAssignments() { string [] code = new [] { " PROGRAM PARSETEST", " INTEGER A,C", " REAL B", " A = 12", " B = 4.67", " B = A", " C = 12.78", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(0, comp.Messages.Count); }
public void ValidateFilenameParsing() { FortranOptions opts = new FortranOptions(); string[] args = new [] { "-backslash", "testfile1.f", "-debug", "testfile2.f" }; Assert.IsTrue(opts.Parse(args)); Assert.IsTrue(opts.SourceFiles.Count == 2); Assert.AreEqual(opts.SourceFiles[0], "testfile1.f"); Assert.AreEqual(opts.SourceFiles[1], "testfile2.f"); Assert.IsTrue(opts.Backslash); Assert.IsTrue(opts.GenerateDebug); }
protected string RunCompile(Stream stream, string fileName) { string result = null; try { var compiler = new CCompiler(stream, fileName); compiler.Compile(); result = compiler.OutputFileName; } catch (FormatException e) { Console.WriteLine(e.Message); } catch (Exception e) { Console.WriteLine($"Uncatched error:\n { e.Message }"); } return(result); }
public void ValidateBackslashStringParsing() { string [] code = new [] { " \"Ab\\tCDEf\\n\"" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.STRING); StringToken stringToken = (StringToken)token; Assert.AreEqual(stringToken.String, "Ab\tCDEf\n"); // Turn on the option to treat backslash character as // a backslash and not a special character. opts.Backslash = true; ls = new Lexer(code, opts, messages); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.STRING); stringToken = (StringToken)token; Assert.AreEqual(stringToken.String, "Ab\\tCDEf\\n"); }
public void ValidateHasLabel() { string [] code = new [] { "100 INTEGER A", " STOP" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); Assert.IsTrue(ls.GetKeyword().ID == TokenID.KINTEGER); Assert.IsTrue(ls.HasLabel); Assert.IsTrue(ls.Label == "100"); Assert.IsTrue(ls.GetToken().ID == TokenID.IDENT); Assert.IsTrue(messages.ErrorCount == 0); }
public void ValidateHexParsing() { string [] code = new [] { " $CC4DE", " Z'CC4DE'", " Z\"CC4DE\"", " $AGG" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.INTEGER); IntegerToken intToken = (IntegerToken)token; Assert.AreEqual(intToken.Value, 0xCC4DE); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.INTEGER); intToken = (IntegerToken)token; Assert.AreEqual(intToken.Value, 0xCC4DE); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.INTEGER); intToken = (IntegerToken)token; Assert.AreEqual(intToken.Value, 0xCC4DE); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.INTEGER); intToken = (IntegerToken)token; Assert.AreEqual(intToken.Value, 0xA); Assert.IsTrue(ls.GetToken().ID == TokenID.IDENT); }
public void ValidateExceedMaximumContinuationLines() { string [] code = new [] { " INTEGER A,", " 1B,", " 2C,", " 3D,", " 4E,", " 5F,", " 6G,", " 7H,", " 8I,", " 9J,", " AK,", " BL,", " CM,", " DN,", " EO,", " FP,", " GQ,", " HR,", " IS,", " JT", " KU" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(1, comp.Messages.ErrorCount); Assert.AreEqual(21, comp.Messages[0].Line); Assert.AreEqual(MessageCode.TOOMANYCONTINUATION, comp.Messages[0].Code); }
public void ValidateF77ExtContinuationCharacter() { string [] code = new [] { "100 INTEGER STA&", " TION" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); Assert.IsTrue(ls.GetKeyword().ID == TokenID.KINTEGER); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.IDENT); IdentifierToken identToken = (IdentifierToken)token; Assert.AreEqual(identToken.Name, "STATION"); }
public void ValidateStringParsing() { string [] code = new [] { " PRINT \"AbCDEf\"" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); Assert.IsTrue(ls.GetKeyword().ID == TokenID.KPRINT); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.STRING); StringToken stringToken = (StringToken)token; Assert.AreEqual(stringToken.String, "AbCDEf"); }
public void ParseVerifyImplicitNone() { string [] code = new [] { " PROGRAM PARSETEST", " IMPLICIT NONE", " INTEGER A", " A = 20", " B = A", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(1, comp.Messages.Count); Assert.AreEqual(MessageCode.UNDEFINEDVARIABLE, comp.Messages[0].Code); Assert.AreEqual(5, comp.Messages[0].Line); }
public void ParseVerifyIllegalChar() { string [] code = new [] { " PROGRAM PARSETEST", " INTEGER A", " CHARACTER B", " B = 'A'", " A = B", " B = 89", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(2, comp.Messages.Count); Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[0].Code); Assert.AreEqual(5, comp.Messages[0].Line); Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[1].Code); Assert.AreEqual(6, comp.Messages[1].Line); }
public void ValidateOctalParsing() { string [] code = new [] { " O'745'", " O\"340\"", " O'892'" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.INTEGER); IntegerToken intToken = (IntegerToken)token; Assert.AreEqual(intToken.Value, 485); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.INTEGER); intToken = (IntegerToken)token; Assert.AreEqual(intToken.Value, 224); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); ls.GetToken(); Assert.IsTrue(messages.ErrorCount > 0); Assert.IsTrue(messages[0].Line == 3); Assert.IsTrue(messages[0].Code == MessageCode.BADNUMBERFORMAT); }
public void ParseVerifyTypeFormats() { string [] code = new [] { " INTEGER A", " REAL B", " CHARACTER C*5,D", " DOUBLE PRECISION E", " LOGICAL F,G,H" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(0, comp.Messages.ErrorCount); }
public void ArrayVerifyArrayToFunction() { string [] code = new [] { " FUNCTION TEST", " PARAMETER (MAXVAL = 10)", " REAL ARRAY(MAXVAL)", " ARRAY(2) = 4.2", " TEST=FOO(ARRAY)", " END", " FUNCTION FOO(R)", " PARAMETER (MAXVAL = 10)", " REAL R(MAXVAL)", " RETURN R(2)", " END" }; Compiler comp = Helper.HelperCompile(code, new FortranOptions()); Helper.HelperRunFloat(comp, "TEST", 4.2f); }
public void ParseVerifyRedefinitions() { string [] code = new [] { " INTEGER A", " REAL B", " CHARACTER B", " DOUBLE PRECISION B", " LOGICAL F,G,H" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(2, comp.Messages.ErrorCount); Assert.AreEqual(MessageCode.IDENTIFIERREDEFINITION, comp.Messages[0].Code); Assert.AreEqual(3, comp.Messages[0].Line); Assert.AreEqual(MessageCode.IDENTIFIERREDEFINITION, comp.Messages[1].Code); Assert.AreEqual(4, comp.Messages[1].Line); }
public void ParseVerifyLogicalAssignment() { string [] code = new [] { " PROGRAM PARSETEST", " IMPLICIT NONE", " LOGICAL L1,L2", " L1 = .TRUE.", " L2 = .FALSE.", " L1 = L2", " L1 = 90 .GT. 45", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(0, comp.Messages.Count); }
public void ParseVerifyImplicitOrdering() { string [] code = new [] { " PROGRAM PARSETEST", " IMPLICIT LOGICAL(L)", " IMPLICIT NONE", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(1, comp.Messages.Count); Assert.AreEqual(MessageCode.TOKENNOTPERMITTED, comp.Messages[0].Code); }
public void ValidateIntegerParsing() { string [] code = new [] { " 1230976AA" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.INTEGER); IntegerToken intToken = (IntegerToken)token; Assert.AreEqual(intToken.Value, 1230976); }
public void ParseVerifyBadLogicalAssignment() { string [] code = new [] { " PROGRAM PARSETEST", " IMPLICIT NONE", " LOGICAL L1,L2", " L1 = 12", " L2 = 9.67", " L1 = 'Ch'", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(3, comp.Messages.Count); Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[0].Code); Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[1].Code); Assert.AreEqual(MessageCode.TYPEMISMATCH, comp.Messages[2].Code); }
public void ValidateMaximumContinuationLines() { string [] code = new [] { " INTEGER A,", " 1B,", " 2C,", " 3D,", " 4E,", " 5F,", " 6G,", " 7H,", " 8I,", " 9J,", " AK,", " BL,", " CM,", " DN,", " EO,", " FP,", " GQ,", " HR,", " IS,", " JT" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(0, comp.Messages.ErrorCount); }
public void ValidateTabDelimiter() { string [] code = new [] { "100\tINTEGER A", "\tREAL B" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); Assert.IsTrue(ls.GetKeyword().ID == TokenID.KINTEGER); Assert.IsTrue(ls.HasLabel); Assert.IsTrue(ls.Label == "100"); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.IDENT); IdentifierToken identToken = (IdentifierToken)token; Assert.AreEqual(identToken.Name, "A"); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); Assert.IsTrue(ls.GetKeyword().ID == TokenID.KREAL); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.IDENT); identToken = (IdentifierToken)token; Assert.AreEqual(identToken.Name, "B"); }
public void ValidateRealParsing() { string [] code = new [] { " 123.0976AA", " 123.0976E-2", " .5" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.REAL); RealToken realToken = (RealToken)token; Assert.IsTrue(System.Math.Abs(realToken.Value - 123.0976f) < float.Epsilon, "Expected 123.0976 but saw " + realToken.Value); Assert.IsTrue(ls.GetToken().ID == TokenID.IDENT); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.REAL); realToken = (RealToken)token; Assert.IsTrue(System.Math.Abs(realToken.Value - 123.0976E-2f) < float.Epsilon, "Expected 123.0976E-2 but saw " + realToken.Value); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.REAL); realToken = (RealToken)token; Assert.IsTrue(System.Math.Abs(realToken.Value - 0.5f) < float.Epsilon, "Expected 0.5 but saw " + realToken.Value); }
public void ParseVerifyExpressionCollapsing() { string [] code = new [] { " PROGRAM PARSETEST", " IMPLICIT NONE", " INTEGER A(12+34), B(90-10), C(4-2:9-3)", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(0, comp.Messages.ErrorCount); }
public void ValidateDebug() { string [] code = new [] { " INTEGER A", "D REAL B", " INTEGER C" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); Assert.IsTrue(ls.GetKeyword().ID == TokenID.KINTEGER); Assert.IsTrue(ls.GetToken().ID == TokenID.IDENT); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); Assert.IsTrue(ls.GetKeyword().ID == TokenID.KINTEGER); // Now it should pick up 'D' lines. opts.GenerateDebug = true; ls = new Lexer(code, opts, messages); Assert.IsTrue(ls.GetKeyword().ID == TokenID.KINTEGER); Assert.IsTrue(ls.GetToken().ID == TokenID.IDENT); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); Assert.IsTrue(ls.GetKeyword().ID == TokenID.KREAL); }
public void ParseVerifyImplicit1() { string [] code = new [] { " PROGRAM PARSETEST", " IMPLICIT INTEGER(A-Z)", " A = 20", " B = A", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(0, comp.Messages.Count); }
public void ValidateDoublePrecisionParsing() { string [] code = new [] { " 123.0976D4AA", " 123.0976D-2" }; FortranOptions opts = new FortranOptions(); MessageCollection messages = new MessageCollection(opts); Lexer ls = new Lexer(code, opts, messages); SimpleToken token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.DOUBLE); DoubleToken realToken = (DoubleToken)token; Assert.IsTrue(Helper.DoubleCompare(realToken.Value, 123.0976E4), "Expected 123.0976E4 but saw " + realToken.Value); Assert.IsTrue(ls.GetToken().ID == TokenID.IDENT); Assert.IsTrue(ls.GetToken().ID == TokenID.EOL); token = ls.GetToken(); Assert.IsTrue(token.ID == TokenID.DOUBLE); realToken = (DoubleToken)token; Assert.IsTrue(Helper.DoubleCompare(realToken.Value, 123.0976E-2), "Expected 123.0976E-2 but saw " + realToken.Value); }
public void ParseVerifyConstantAssignment() { string [] code = new [] { " PROGRAM PARSETEST", " PARAMETER (I=12)", " I = 45", " END" }; Compiler comp = new Compiler(new FortranOptions()); comp.CompileString(code); Assert.AreEqual(1, comp.Messages.Count); Assert.AreEqual(MessageCode.CANNOTASSIGNTOCONST, comp.Messages[0].Code); Assert.AreEqual(3, comp.Messages[0].Line); }