Ejemplo n.º 1
0
        private void Parsing(AssignNode node, StringBuilder sb, ref int lineNum)
        {
            if (node.ChildCount > 1)                                   // инициализация
            {
                Parsing(node.GetChild(1) as dynamic, sb, ref lineNum); // кладем в стек

                string varName = node.GetChild(0).GetChild(0).Text;
                string command = globalVars.IsContains(varName)
                    ? String.Format("stsfld  {0} Program::{1}", ToMsilType(globalVars.GetTypeVar(varName).ToString().ToLower()), varName)
                    : String.Format("stloc {0}", node.GetChild(0).GetChild(1).Text);


                PrintCommand(sb, command, ref lineNum); // загружаем в переменную
            }
        }
Ejemplo n.º 2
0
        private void Parsing(AssignNode node, VarType left, string methodName)
        {
            if (node.GetChild(1).Type == 0)
            {
                Console.WriteLine("Некорректная инициализация переменной. Строка {0}", node.Line);
            }
            else
            {
                dynamic id = node.GetChild(0);
                if (id is ArrayInitNode)
                {
                    GetArrayType(id, methodName);
                    Parsing(id.GetChild(0) as dynamic, methodName);
                    Parsing(id.GetChild(1) as dynamic, methodName);
                }
                else
                {
                    Parsing(id, methodName);
                }

                dynamic temp = node.GetChild(1);

                var right = VarType.Undefined;

                if (temp is ArrayInitNode)
                {
                    right = GetArrayType(temp, methodName);
                    Parsing(temp.GetChild(0) as dynamic, methodName);
                    Parsing(temp.GetChild(1) as dynamic, methodName);
                }
                else
                {
                    right = Parsing(temp, methodName);
                }
                

                if ((left == VarType.Int && right == VarType.Double) || right == VarType.Void)
                {
                    Console.WriteLine("Несоответствие типов. {0} нельзя привести к {1}. Строка {2}", left, right, node.Line);
                }
            }
        }