// Display token header to screen and output file
        public void DisplayTokenHeader()
        {
            string[] headingData = new string[] { "Lexeme", "Token", "Attribute" };
            string   headerRule  = Environment.NewLine + new string('-', 79);

            CommonTools.WriteOutput(string.Format(OutputFormat, headingData) + headerRule);
        }
Пример #2
0
 // Helper function to write given list of nodes to screen
 private void WriteNodes(IEnumerable <Node> nodeList)
 {
     foreach (Node node in nodeList)
     {
         string[] outputData = new string[] { node.Lexeme, node.GetClass(), node.Depth.ToString() };
         CommonTools.WriteOutput(string.Format(OutputFormat, outputData));
     }
 }
Пример #3
0
        // Display detailed table header to screen and output file
        private void DisplayDetailedSymbolTableHeader(int depth)
        {
            CommonTools.WriteOutput($"** Symbol Table at Depth {depth} **");
            string[] headingData = new string[] { "Lexeme", "Class", "Depth", "Offset", "Type", "Size", "Value(r)" };
            string   headerRule  = Environment.NewLine + new string('-', 80);

            CommonTools.WriteOutput(string.Format(OutputDetailedFormat, headingData) + headerRule);
        }
Пример #4
0
        // Display symbol table header to screen and output file
        private void DisplaySymbolTableHeader(int depth)
        {
            CommonTools.WriteOutput($"** Symbol Table at Depth {depth} **");
            string[] headingData = new string[] { "Lexeme", "Class", "Depth" };
            string   headerRule  = Environment.NewLine + new string('-', 75);

            CommonTools.WriteOutput(string.Format(OutputFormat, headingData) + headerRule);
        }
Пример #5
0
        // Helper function to output data for functions
        private void OutputDetailedConstant(Node node)
        {
            ConstantNode outputNode  = (ConstantNode)node;
            var          outputValue = outputNode.Value ?? outputNode.ValueReal;

            string[] outputData = new string[] { outputNode.Lexeme, outputNode.GetClass(), outputNode.Depth.ToString(),
                                                 "-", "-", "-", outputValue.ToString() };
            CommonTools.WriteOutput(string.Format(OutputDetailedFormat, outputData));
        }
Пример #6
0
        // Helper function to output data for variables
        private void OutputDetailedVariable(Node node)
        {
            VariableNode outputNode = (VariableNode)node;

            string[] outputData = new string[] { outputNode.Lexeme, outputNode.GetClass(), outputNode.Depth.ToString(),
                                                 outputNode.Offset.ToString(), outputNode.Type.ToString(),
                                                 outputNode.Size.ToString(), "-" };

            CommonTools.WriteOutput(string.Format(OutputDetailedFormat, outputData));
        }
Пример #7
0
        // Validates that a single comman line argument exists and its path is valid
        private static bool ValidateArguments(string[] arguments)
        {
            if (arguments.Length == 1)
            {
                return(CommonTools.CheckFilePathExists(arguments[0]));
            }

            CommonTools.WriteOutput("ERROR: Usage expected 1 command line argument");
            return(false);
        }
        private bool CheckMainDeclared()
        {
            if (!(SymbolTable.LookupNode("main") is FunctionNode))
            {
                CommonTools.WriteOutput("ERROR: No required function \"main\" exists");
                return(false);
            }

            OutputThreeAddressCode("START PROC main");
            return(true);
        }
        // Display next token to screen and output file
        public void DisplayCurrentToken()
        {
            if (Token != Token.EndOfFileToken)
            {
                dynamic attribute = Value ?? ValueReal;
                attribute = attribute ?? Literal;

                string[] outputData = new string[] { Lexeme, Token.ToString(), attribute.ToString() };
                CommonTools.WriteOutput(string.Format(OutputFormat, outputData));
            }
        }
Пример #10
0
 // Displays given depth's detailed symbol table information to output
 public void OutputDetailedSymbolTable(int depth)
 {
     DisplayDetailedSymbolTableHeader(depth);
     foreach (LinkedList <Node> nodeList in HashTable)
     {
         if (nodeList != null)
         {
             WriteDetailedNodes(nodeList.Where(item => item.Depth == depth));
         }
     }
     CommonTools.WriteOutput(Environment.NewLine);
 }
        // Process a comment token
        private void SkipComment()
        {
            while (Character != Char.MinValue)
            {
                GetNextCharacter();
                if (CommentEndSearch())
                {
                    return;
                }
            }

            CommonTools.WriteOutput("ERROR: Expected comment end '*/' not found");
        }
Пример #12
0
        // Displays given depth/scope level to output
        public void OutputSymbolTable(int depth)
        {
            if (CommonTools.SemanticAnalysisDebug && !CommonTools.ThreeAddressCodeRun)
            {
                OutputDetailedSymbolTable(depth);
                return;
            }

            if (!CommonTools.ParserDebug && !CommonTools.ThreeAddressCodeRun)
            {
                DisplaySymbolTableHeader(depth);
                WriteNodes(GetSymbolTableDepth(depth));
                CommonTools.WriteOutput(Environment.NewLine);
            }
        }
Пример #13
0
        // Helper function to output data for functions
        private void OutputDetailedFunction(Node node)
        {
            string[]     outputData;
            FunctionNode outputNode = (FunctionNode)node;

            outputData = new string[] { outputNode.Lexeme, outputNode.GetClass(), outputNode.Depth.ToString(),
                                        "-", outputNode.ReturnType.ToString(), outputNode.LocalsSize.ToString(), "-" };
            CommonTools.WriteOutput(string.Format(OutputDetailedFormat, outputData));

            foreach (ParameterNode item in outputNode.Parameters)
            {
                outputData = new string[] { "-", "Parameter", "-", "-", item.Type.ToString(), "-", "-" };
                CommonTools.WriteOutput(string.Format(OutputDetailedFormat, outputData));
            }
        }
        public bool Start()
        {
            bool programCorrect = ProcessProgram() && CheckMainDeclared();

            if (LexicalAnaylzer.Token != Token.EndOfFileToken && programCorrect)
            {
                CommonTools.PromptProgramErrorExit(
                    $"ERROR: Line {LexicalAnaylzer.LineNumber} " +
                    $"Unexpected tokens in source file, expected End-of-File Token");
            }

            if ((CommonTools.ThreeAddressCodeRun) && programCorrect)
            {
                CommonTools.WriteOutput(ThreeAddressCodeOutput);
            }
            return(programCorrect);
        }
Пример #15
0
        // Initializes and runs Parser module
        public static void StartParser(string[] arguments)
        {
            ValidateArguments(arguments);
            CommonTools.SetupOutputs(new string[] { GlobalConfiguration.ParserOutputPath });
            CommonTools.ClearOutputDisplays();

            LexicalAnalyzer lexicalAnalyzer = new LexicalAnalyzer(arguments[0]);

            lexicalAnalyzer.GetNextToken();

            SymbolTable symbolTable = new SymbolTable();
            Parser      parser      = new Parser(lexicalAnalyzer, symbolTable);

            if (parser.Start())
            {
                symbolTable.OutputSymbolTable(1);
            }

            CommonTools.WriteOutput($"Completed processing {Path.GetFileName(arguments[0])}");
            CommonTools.PromptProgramExit();
        }
 // Writes given array of outputs to screen at index columns
 public void OutputAssembly(string[] outputs)
 {
     CommonTools.WriteOutput(string.Format(OutputFormat, outputs));
 }