Ejemplo n.º 1
0
        public string[] SubstituteSymbolsWithValues(string[] assemblyInstructions)
        {
            List <string> assemblyInstructionsWithoutSymbols = new List <string>();

            foreach (string instruction in assemblyInstructions)
            {
                if (!SyntaxValidator.IsLabel(instruction))
                {
                    if (SyntaxValidator.IsAddressInstructionWithSymbol(instruction))
                    {
                        string addressSymbol = instruction.Remove(0, 1);

                        if (!symbolTable.Contains(addressSymbol))
                        {
                            symbolTable.AddVariable(addressSymbol);
                        }

                        assemblyInstructionsWithoutSymbols.Add("@" + symbolTable.GetValue(addressSymbol));
                    }
                    else
                    {
                        assemblyInstructionsWithoutSymbols.Add(instruction);
                    }
                }
            }

            return(assemblyInstructionsWithoutSymbols.ToArray());
        }
Ejemplo n.º 2
0
 static void MainProcess(StreamWriter writer, string inputFile, SymbolTable symbolTable)
 {
     using (var parser = new Parser(inputFile))
     {
         string line    = "";
         int    counter = 16;
         while (parser.HasMoreCommands())
         {
             parser.Advance();
             if (parser.CommandType() == Parser.A_COMMAND)
             {
                 int    address = 0;
                 string symbol  = parser.GetSymbol();
                 if (!Int32.TryParse(symbol, out address))
                 {
                     if (symbolTable.Contains(symbol))
                     {
                         address = symbolTable.GetAddress(parser.GetSymbol());
                     }
                     else
                     {
                         address = counter++;
                         symbolTable.AddEntry(symbol, address);
                     }
                 }
                 line = Convert.ToString(address, 2).PadLeft(16, '0');
             }
             else if (parser.CommandType() == Parser.C_COMMAND)
             {
                 var dest = Code.Dest(parser.GetDest());
                 var comp = Code.Comp(parser.GetComp());
                 var jump = Code.Jump(parser.GetJump());
                 line = "111" + comp + dest + jump;
             }
             else
             {
                 continue; // skip labels
             }
             writer.WriteLine(line);
         }
     }
 }