コード例 #1
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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);
        }
コード例 #2
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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");
        }
コード例 #3
0
ファイル: compiler.cs プロジェクト: stevewpalmer/jcom
 /// INCLUDE keyword
 /// Insert the contents of the specified file at the current point
 /// in the lexical analysis.
 ParseNode KInclude()
 {
     EnsureNoLabel();
     string filename = ParseStringLiteral();
     string savedFilename = _messages.Filename;
     Lexer savedLexer = _ls;
     if (filename != null) {
         List<String> lines = new List<String>();
         try {
             string fullPath = Path.Combine(Path.GetDirectoryName(_messages.Filename), filename);
             using (StreamReader sr = new StreamReader(fullPath)) {
                 while (sr.Peek() != -1) {
                     string line = sr.ReadLine();
                     lines.Add(line);
                 }
             }
             CompileUnit(filename, lines.ToArray());
             _ls = savedLexer;
             _messages.Filename = savedFilename;
         } catch (IOException e) {
             _ls = savedLexer;
             _messages.Error(MessageCode.INCLUDEERROR, String.Format("INCLUDE error: {0}", e.Message));
         }
     }
     return null;
 }
コード例 #4
0
ファイル: compiler.cs プロジェクト: stevewpalmer/jcom
        // Compile a code unit, such as an include file.
        void CompileUnit(string filename, string [] lines)
        {
            _ls = new Lexer(lines, _opts, _messages);
            _messages.Filename = filename;

            // Mark this file.
            _ptree.Add(MarkFilename());

            // Loop and parse one single line at a time.
            SimpleToken token = _ls.GetKeyword();
            while (token.ID != TokenID.ENDOFFILE) {
                if (token.ID != TokenID.EOL) {
                    ParseNode labelNode = CheckLabel();
                    if (labelNode != null) {
                        _ptree.Add(labelNode);
                    }
                    ParseNode node = Statement(token);
                    if (node != null) {
                        _ptree.Add(MarkLine());
                        _ptree.Add(node);
                    }
                    ExpectEndOfLine();
                }
                token = _ls.GetKeyword();
            }
        }
コード例 #5
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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");
        }
コード例 #6
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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);
        }
コード例 #7
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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");
        }
コード例 #8
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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);
        }
コード例 #9
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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);
        }
コード例 #10
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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);
        }
コード例 #11
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
 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);
 }
コード例 #12
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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");
        }
コード例 #13
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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);
        }
コード例 #14
0
ファイル: lexer.cs プロジェクト: stevewpalmer/jcom
        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);
        }