示例#1
0
        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);
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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}.");
        }
示例#4
0
        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}.");
        }
示例#5
0
        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);
        }