// 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(); } }
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 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 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 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 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); }