コード例 #1
0
ファイル: CSymbolTable.cs プロジェクト: jmyerscough/Compiler
        /// <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();
            }
        }
コード例 #2
0
ファイル: CParser.cs プロジェクト: jmyerscough/Compiler
        /// <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);
        }
コード例 #3
0
ファイル: CParser.cs プロジェクト: jmyerscough/Compiler
        /// <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();
            }
        }