public static VariableSymbolTableEntry AccessMember(List <string> identifierList) { string symbolIdentifier = identifierList[identifierList.Count - 1]; SymbolTable symbolTable = TopSymbolTables[identifierList[0]]; SymbolTableEntry symbolTableEntry = symbolTable.RetrieveSymbolInChildScope(symbolIdentifier); if (symbolTableEntry is VariableSymbolTableEntry variableSymbolTableEntry) { return(variableSymbolTableEntry); } return(null); }
public void AddOrUpdateSymbol(string identifier, SymbolTableEntry data) { if (symbols.ContainsKey(identifier)) { symbols[identifier] = data; return; } SymbolTable symbolTable = RetrieveSymbolTable(identifier); if (symbolTable != null) { symbolTable.AddOrUpdateSymbol(identifier, data); } else { symbols.Add(identifier, data); } }
public SymbolTableEntry RetrieveSymbolInParentScope(string identifier) { if (symbols.TryGetValue(identifier, out SymbolTableEntry symbol)) { return(symbol); } if (Parent != null) { SymbolTableEntry parentSymbol = Parent.RetrieveSymbolInParentScope(identifier); if (parentSymbol != null) { return(parentSymbol); } } throw new ArgumentException($"Invalid identifier: {identifier}."); }
public SymbolTableEntry RetrieveSymbolInChildScope(string identifier) { if (symbols.TryGetValue(identifier, out SymbolTableEntry symbol)) { return(symbol); } if (Children.Count > 0) { foreach (SymbolTable childSymbolTable in Children) { SymbolTableEntry childSymbol = childSymbolTable.RetrieveSymbolInChildScope(identifier); if (childSymbol != null) { return(childSymbol); } } } throw new ArgumentException($"Invalid identifier: {identifier}."); }
public void Visit(IdentifierValueNode identifierValueNode) { SymbolTableEntry entry; try { entry = symbolTable.RetrieveSymbolInParentScope(identifierValueNode.Identifier); } catch (Exception e) { DazelLogger.EmitError(e.Message, identifierValueNode.Token); return; } if (entry is VariableSymbolTableEntry variableSymbolTableEntry) { ExpressionNode expression = variableSymbolTableEntry.ValueNode; SetNumericalExpression(identifierValueNode, expression, entry.Type); } SymbolTableEntry symbolTableEntry = symbolTable.RetrieveSymbolInParentScope(identifierValueNode.Identifier); typeHandler.SetType(symbolTableEntry.Type, identifierValueNode.Token); }