コード例 #1
0
        private SymbolTable handleRoutineBody(AstNode node, SymbolTable table)
        {
            List <AstNode> childes = node.getChilds();

            foreach (var j in childes)
            {
                if (j.GetNodeType().Equals(AstNode.NodeType.Constant))
                {
                    List <AstNode> consts = j.getChilds();
                    foreach (var constant in consts)
                    {
                        AstNode          id    = constant.getChilds()[0];
                        SymbolTableEntry entry = new SymbolTableEntry(id);
                        entry.type          = "int";
                        entry.isConst       = true;
                        entry.isInitialized = true;
                        table.Add(((Token)id.getValue()).GetValue(), entry);
                        return(table);
                    }
                }
                else if (j.GetNodeType().Equals(AstNode.NodeType.Variable))
                {
                    var childs = j.getChilds();
                    var type   = ((Token)childs[0].getValue()).GetValue();

                    for (var i = 1; i < childs.Count; i++)
                    {
                        var id    = childs[i].getChilds()[0];
                        var entry = new SymbolTableEntry(id);
                        entry.type = type;
                        if (childs.Count > 1 && childs[1].GetNodeType().Equals(AstNode.NodeType.Expression))
                        {
                            entry.isInitialized = true;
                        }

                        table.Add(((Token)id.getValue()).GetValue(), entry);
                    }

                    return(table);
                }
                else
                {
                    SymbolTable newTable = handleRoutineBody(j, table);
                    foreach (var t in newTable.Values)
                    {
                        table.Add(t.name, t);
                    }

                    return(table);
                }
            }

            return(new SymbolTable());
        }
コード例 #2
0
        private string handleParameters(AstNode parameter, RoutineTableEntry entry)
        {
            string type = ((Token)parameter.getValue()).GetValue();
            string name = ((Token)parameter.getChilds()[0].getValue()).GetValue();

            checkSymbol(name);
            SymbolTableEntry symbolTableEntry = new SymbolTableEntry(parameter.getChilds()[0]);

            symbolTableEntry.type = type;
            symbols.Add(name, symbolTableEntry);
            return(type);
        }
コード例 #3
0
        private void handleSymbol(AstNode node)
        {
            var entry = new SymbolTableEntry(node, maxVarId++);

            symbols.Add(entry.name, entry);
        }