/// <summary> /// The contrucutor loads the SpecialRegister file and stores /// register and memory address in the symbol table. /// </summary> public CSymbolTable(String Filename) : base() { XmlReader SpecialRegFile = null; try { SpecialRegFile = XmlReader.Create(Filename, new XmlReaderSettings()); while (SpecialRegFile.Read() == true) { CVariable SpecialRegisters = null; String VariableName = ""; Int16 MemoryLocation = 0; if (SpecialRegFile.NodeType == XmlNodeType.Element) { if (Int16.TryParse(SpecialRegFile.GetAttribute("address"), out (short)MemoryLocation) == true) { SpecialRegFile.Read(); VariableName = SpecialRegFile.Value; SpecialRegisters = new CVariable(VariableName, TDataType.INTEGER, 0, MemoryLocation); Add(VariableName, SpecialRegisters); } } } } catch (InvalidOperationException) { throw new CCompilerException("Cannot Open " + Filename, TErrorCodes.FILE_ACCESS_ERR); } finally { SpecialRegFile.Close(); } }
/// <summary> /// /// </summary> public void ParameterDeclaration(CFunction FunctionDefinition) { String Argument = ""; CVariable NewIdentifier = null; TypeSpecifier(); Argument = Declarator(FunctionDefinition); NewIdentifier = new CVariable(Argument, TDataType.INTEGER, m_LexScanner.ScopeLevelCount, 0); FunctionDefinition.AddParameter(Argument); m_SymbolTable.Add(Argument, NewIdentifier); }
/// <summary> /// /// </summary> public void InitDeclarations() { CIdentiferBase NewIdentifier = null; // used for debugging String TokenVal = ""; if (m_LexScanner.Match(TTokens.IDENTIFIER) == false) throw new CCompilerException("Identifier expected.", m_LexScanner.LineNumber, TErrorCodes.PARSER_ERROR); // add the variable to the symbol table. // The key value for the symbol entry is the identifier name and // scope level value and the name of the current function. if (m_SymbolTable.ContainsKey(m_LexScanner.TokenValue) == true) throw new CCompilerException("Identifier already declared.", m_LexScanner.LineNumber, TErrorCodes.PARSER_ERROR); else { TokenVal = m_LexScanner.TokenValue; NewIdentifier = new CVariable(m_LexScanner.TokenValue, TDataType.INTEGER, m_LexScanner.ScopeLevelCount, 0); m_SymbolTable.Add(m_LexScanner.TokenValue, NewIdentifier); } if (m_LexScanner.NextToken() == TTokens.ASSIGNMENT) { AssignmentExpression(ref m_CurrentOperator); } while (m_LexScanner.NextToken() == TTokens.COMMA) { m_LexScanner.Match(TTokens.COMMA); InitDeclarations(); } }