Esempio n. 1
0
        private void EnterIdentifiers(IEnumerable <IdentifierNode> identifiers, SymbolTableEntryType type, ref int localVariableIndex)
        {
            int index;

            if (type == SymbolTableEntryType.Parameter)
            {
                index = 0;
            }
            else if (type == SymbolTableEntryType.Variable)
            {
                index = localVariableIndex;
            }
            else
            {
                throw new ArgumentException("type must be Parameter or Variable", "type");
            }

            foreach (var identifier in identifiers)
            {
                string scopeString = _scopeStack.CreateScopeString(identifier.Name);
                var    entry       = new SymbolTableEntry(identifier.Name, type, index);
                AddSymbol(scopeString, entry);
                ++index;
            }

            if (type == SymbolTableEntryType.Variable)
            {
                localVariableIndex = index;
            }
        }
 private int GetLocalsIndex(SymbolTableEntry entry)
 {
     if (entry.Type == SymbolTableEntryType.Parameter)
     {
         return(entry.Index);
     }
     return(_parameterCounts.Peek() + entry.Index);
 }
        /// <summary>
        /// Creates a baseline table entry and inserts it into the symbol table.
        /// </summary>
        /// <param name="entryType"></param>
        public ISymbolTableEntry CreateTableEntry(EntryType entryType)
        {
            SymbolTableEntry entry = new SymbolTableEntry(Token.idt, lexeme.ToString(), depth, entryType);

            CheckDuplicates();
            Insert(entry);

            return(entry);
        }
Esempio n. 4
0
 public void FindSymbols(ProgramNode program)
 {
     // We want functions to be callable independently of their declaration order, so we do a first pass to find all function names
     foreach (var function in program.Functions)
     {
         var entry = new SymbolTableEntry(function.Name.Name, SymbolTableEntryType.Function, 0);
         AddSymbol(function.Name.Name, entry);
     }
     foreach (var function in program.Functions)
     {
         _scopeStack.PushScope(function.Name.Name);
         int unused = 0;
         EnterIdentifiers(function.Parameters, SymbolTableEntryType.Parameter, ref unused);
         int localVariableIndex = 0;
         FindSymbolsRecursively(function.Body, ref localVariableIndex);
         _scopeStack.PopScope();
         function.LocalVariableCount = localVariableIndex;
     }
 }
Esempio n. 5
0
 public void FindSymbols(ProgramNode program)
 {
     // We want functions to be callable independently of their declaration order, so we do a first pass to find all function names
     foreach (var function in program.Functions)
     {
         var entry = new SymbolTableEntry(function.Name.Name, SymbolTableEntryType.Function, 0);
         AddSymbol(function.Name.Name, entry);
     }
     foreach (var function in program.Functions)
     {
         _scopeStack.PushScope(function.Name.Name);
         int unused = 0;
         EnterIdentifiers(function.Parameters, SymbolTableEntryType.Parameter, ref unused);
         int localVariableIndex = 0;
         FindSymbolsRecursively(function.Body, ref localVariableIndex);
         _scopeStack.PopScope();
         function.LocalVariableCount = localVariableIndex;
     }
 }
Esempio n. 6
0
        private void EnterIdentifiers(IEnumerable<IdentifierNode> identifiers, SymbolTableEntryType type, ref int localVariableIndex)
        {
            int index;
            if (type == SymbolTableEntryType.Parameter)
                index = 0;
            else if (type == SymbolTableEntryType.Variable)
                index = localVariableIndex;
            else
                throw new ArgumentException("type must be Parameter or Variable", "type");

            foreach (var identifier in identifiers)
            {
                string scopeString = _scopeStack.CreateScopeString(identifier.Name);
                var entry = new SymbolTableEntry(identifier.Name, type, index);
                AddSymbol(scopeString, entry);
                ++index;
            }

            if (type == SymbolTableEntryType.Variable)
                localVariableIndex = index;
        }
Esempio n. 7
0
 private void AddSymbol(string key, SymbolTableEntry entry)
 {
     _symbols.Add(key, entry);
 }
Esempio n. 8
0
 private void AddSymbol(string key, SymbolTableEntry entry)
 {
     _symbols.Add(key, entry);
 }
 private int GetLocalsIndex(SymbolTableEntry entry)
 {
     if (entry.Type == SymbolTableEntryType.Parameter)
         return entry.Index;
     return _parameterCounts.Peek() + entry.Index;
 }