コード例 #1
0
        private COOPClass calculateLowestMemberCoopClass(ParseNode o, COOPClass p)
        {
            if (!o.Equals("<member>"))
            {
                return(null);
            }
            if (!o.Contains("<member>"))
            {
                return(variablesToType[o.terminals]);
            }

            ParseNode ptr     = o;
            COOPClass current = p;

            while (ptr.Contains("<member>"))
            {
                string memberName = ptr["<symbol>"].terminals;
                if (o.Contains("<function_call>"))
                {
                    current = current.Functions[memberName].ReturnType;
                }
                else
                {
                    current = current.VarNames[memberName];
                }

                ptr = ptr["<member>"];
            }

            return(current);
        }
コード例 #2
0
        private CallNode convertMember(CallNode parent, ParseNode m)
        {
            if (!m.Equals("<member>"))
            {
                return(null);
            }


            bool hasFunctionCall = m.Contains("<function_call>"),
                 hasMember       = m.Contains("<member>");

            CallNode output;

            if (hasFunctionCall)
            {
                output = createObjectFunctionCall(parent, m["<symbol>"], m["<function_call>"]);
            }
            else
            {
                output = createSymbolNode(parent, m["<symbol>"]);
            }

            if (hasMember)
            {
                output = convertMember(output, m["<member>"]);
            }

            return(output);
        }
コード例 #3
0
        public static List <ParseNode> ConvertListNodeToListOfListObjects(ParseNode parseNode)
        {
            if (!parseNode.Data.Contains("list_"))
            {
                throw new IncompatableParseNodeException();
            }
            if (parseNode.Contains("empty"))
            {
                return(new List <ParseNode>());
            }
            List <ParseNode> output  = new List <ParseNode>();
            ParseNode        nodePtr = parseNode;

            do
            {
                if (nodePtr.Data == "<list_more>")
                {
                    nodePtr = nodePtr[0];
                }
                output.Add(nodePtr["<list_object>"][0]);
                nodePtr = nodePtr["<list_more>"];
            } while (nodePtr != null);

            return(output);
        }
コード例 #4
0
        private static string ConvertJoinObjectToString(ParseNode p)
        {
            if (!p.Equals("<join_object>"))
            {
                throw new IncompatableParseNodeException();
            }

            if (p.Contains("<join_info_full>"))
            {
                return($"({ConvertJoinInfoNodeToString(p[0])})({Parser.ConvertColumnsOneString(p["<columns>"])})");
            }
            return($"{p["<table_name>"][0][0]}({Parser.ConvertColumnsOneString(p["<columns>"])})");
        }
コード例 #5
0
        public CallNode createCallNodeChain(ParseNode o)
        {
            if (!o.Equals("<object>"))
            {
                return(null);
            }

            bool hasFunctionCall = o.Contains("<function_call>"),
                 hasMember       = o.Contains("<member>"),
                 isStatic        = hasFunctionCall && parentClass.Functions[o["<symbol>"].terminals].IsStatic;

            CallNode output;

            if (hasFunctionCall)
            {
                if (isStatic)
                {
                    output = createStaticFunctionCall(o["<symbol>"], o["<function_call>"]);
                }
                else
                {
                    output = createObjectFunctionCall(new ClassCallNode(parentClass), o["<symbol>"],
                                                      o["<function_call>"]);
                }
            }
            else
            {
                output = createSymbolNode(o["<symbol>"]);
            }

            if (hasMember)
            {
                output = convertMember(output, o["<member>"]);
            }

            return(output);
        }
コード例 #6
0
        public void DoCommand(ParseNode n)
        {
            List <CommandObject> objects = new List <CommandObject>();
            string    methodName         = "";
            ParseNode methodNode         = null;

            if (n.Contains("<method>"))
            {
                methodName = n["<method>"][0].Data;
                methodNode = n["<method>"];
            }

            foreach (var node in n.GetAllOfTypeOnlyDirectChildren("<object>"))
            {
                objects.Add(ConvertObject(node));
            }

            switch (methodName)
            {
            case "setVar": {
                string varName = methodNode?["<string>"][0].Data ?? "temp";
                objects[0].SetName(varName);
                Table t = objects[0].Data as Table;
                t?.Relation.StripTableNames();
                if (variables.ContainsKey(varName))
                {
                    variables[varName] = objects[0];
                }
                else
                {
                    variables.Add(varName, objects[0]);
                }
            }
            break;

            default: {
                foreach (CommandObject commandObject in objects)
                {
                    (commandObject?.Data as Table)?.PrintTableNoPadding();
                    (commandObject?.Data as Table)?.DumpData();
                }
            }
            break;
            }
        }
コード例 #7
0
        public CommandTable ConvertTable(ParseNode parseNode)
        {
            if (!parseNode.Equals("<table>"))
            {
                throw new IncompatableParseNodeException();
            }

            Table tableOutput;

            if (parseNode["<list_selection>"] != null)
            {
                string[]  selections, projections;
                ParseNode tableNode = parseNode["<table>"];

                if (parseNode.Contains("<columns>"))
                {
                    projections = ConvertColumns(parseNode["<columns>"]);
                }
                else
                {
                    projections = new string[0];
                }

                ParseNode[] selectionNodes = ConvertListNodeToListOfListObjects(parseNode["<list_selection>"]).ToArray();
                selections = new string[selectionNodes.Length];
                for (int i = 0; i < selectionNodes.Length; i++)
                {
                    selections[i] = $"{selectionNodes[i][0][0].Data}={selectionNodes[i][1][0].Data}";
                }

                if (tableNode.Contains("<join_info_full>"))
                {
                    var tree = new AlgebraNodeTree(db, projections, selections, tableNode["<join_info_full>"]);
                    tableOutput = tree.TableAply();
                    tree.PrintTree();
                }
                else if (tableNode.Contains("<table>"))
                {
                    Table t    = ConvertTable(tableNode["<table>"]).Data as Table;
                    var   tree = new AlgebraNodeTree(t, projections, selections);
                    tableOutput = tree.TableAply();
                    tree.PrintTree();
                }
                else
                {
                    var tree = new AlgebraNodeTree(db, projections, selections, tableNode["<string>"][0].Data);
                    tableOutput = tree.TableAply();
                    tree.PrintTree();
                }
            }
            else if (parseNode.Contains("<join_info_full>"))
            {
                var tree = new AlgebraNodeTree(db, new string[0], new string[0], parseNode["<join_info_full>"]);
                tableOutput = tree.TableAply();
                tree.PrintTree();
            }
            else
            {
                string tableInfo = parseNode["<string>"][0].Data;
                if (variables.ContainsKey(tableInfo))
                {
                    tableOutput = variables[tableInfo].Data as Table;
                    if (tableOutput == null)
                    {
                        tableOutput = db[tableInfo];
                    }
                }
                else
                {
                    tableOutput = db[tableInfo];
                }
            }



            return(new CommandTable(tableOutput));
        }