Example #1
0
        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);
        }
Example #2
0
 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);
 }
Example #3
0
        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);
        }
Example #4
0
 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);
 }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        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");
        }
Example #9
0
 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);
 }
Example #10
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);
        }
Example #11
0
        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);
        }
Example #12
0
        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");
        }
Example #13
0
        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");
        }
Example #14
0
        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);
        }
Example #15
0
        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);
        }
Example #16
0
        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);
        }
Example #17
0
        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);
        }
Example #18
0
 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);
 }
Example #19
0
        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);
        }
Example #20
0
        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);
        }
Example #21
0
        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);
        }
Example #22
0
        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);
        }
Example #23
0
        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);
        }
Example #24
0
        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);
        }
Example #25
0
        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");
        }
Example #26
0
        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);
        }
Example #27
0
        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);
        }
Example #28
0
        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);
        }
Example #29
0
        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);
        }
Example #30
0
        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);
        }
Example #31
0
        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);
        }