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); // загружаем в переменную } }
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); } } }