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); }
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; } }
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 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; }