public Object action(ParseTreeNode node) { Object result = null; //Un case por cada no terminal y terminal que tengamos en la gramatica. switch (node.Term.Name.ToString()) { case "s0": { if (node.ChildNodes.Count == 1) { result = action(node.ChildNodes[0]); } break; } case "ini": { result = action(node.ChildNodes[1]); break; } case "e": { /*en este caso como la produccion de e (e.Rule) tiene 3 reglas e = e+t, e= e-t, e = t * la distincion se hace por medio de los hijos que tiene el nodo, en este caso cuando * tiene un hijo Childnodes.Count = 1 y cuando tiene 3 que seria la suma o la resta*/ //si tiene un hijo e = t entonces se llama recursivamente al parser con el result. if (node.ChildNodes.Count == 1) { result = action(node.ChildNodes[0]); } //si tiene 3 hijos quiere decir que es una suma o una resta por lo que se reduce la operacion //y se opera el result. else if (node.ChildNodes.Count == 3) { //se convierten a decimal los valores double op1 = Convert.ToDouble(action(node.ChildNodes[0]).ToString()); double op2 = Convert.ToDouble(action(node.ChildNodes[2]).ToString()); //los hijos van de 0 a 2 en este caso ya que son 3 (Childnodes.Count==3) por lo que el hijo[1] corresponde //al operador, por lo que se evalua si es signo mas o signo menos y se opera. if (node.ChildNodes[1].Token.Value.ToString() == "+") { result = op1 + op2; } else { result = op1 - op2; } } break; } case "t": { if (node.ChildNodes.Count == 1) { result = action(node.ChildNodes[0]); } else if (node.ChildNodes.Count == 3) { double op1 = Convert.ToDouble(action(node.ChildNodes[0]).ToString()); double op2 = Convert.ToDouble(action(node.ChildNodes[2]).ToString()); if (node.ChildNodes[1].Token.Value.ToString() == "*") { result = op1 * op2; } else { result = op1 / op2; } } break; } case "f": { if (node.ChildNodes.Count == 1) { result = action(node.ChildNodes[0]); } else if (node.ChildNodes.Count == 3) { result = action(node.ChildNodes[1]); } break; } case "enteros": { //por ser un terminal se retorna su valor como tal. result = node.Token.Value; break; } /* * T E R M I N A L E S */ case "componentes": { if (node.ChildNodes.Count == 1) { result = new frm_menujuego(); Console.Out.WriteLine(result.GetType().ToString()); } //si hay dos no terminales que pueden ser: /* esc componentes * nav componentes * def componentes * ene componentes */ else if (node.ChildNodes.Count == 2) { var cmpts = (frm_menujuego)(action(node.ChildNodes[1])); var cmp = action(node.ChildNodes[0]); Console.Out.WriteLine(cmp.GetType().ToString()); if (cmp.GetType().ToString() == "OLC1_practica1.Juego.Escenario") { cmpts.escenarios.Add((Escenario)cmp); result = cmpts; } else if (cmp.GetType().ToString() == "OLC1_practica1.Juego.Nave") { cmpts.naves.Add((Nave)cmp); result = cmpts; } else if (cmp.GetType().ToString() == "OLC1_practica1.Juego.defensa") { cmpts.defensas.Add((defensa)cmp); result = cmpts; } else if (cmp.GetType().ToString() == "OLC1_practica1.Juego.enemigo") { cmpts.enemigos.Add((enemigo)cmp); result = cmpts; } } break; } case "esc": { //por ser un terminal se retorna su valor como tal. var nuevoesc = new Escenario(node.ChildNodes[7].Token.Value.ToString(), node.ChildNodes[11].Token.Value.ToString()); result = nuevoesc; break; } case "nav": { var nuevanave = new Nave(node.ChildNodes[7].Token.Value.ToString(), node.ChildNodes[11].Token.Value.ToString(), node.ChildNodes[15].Token.Value.ToString(), int.Parse(action(node.ChildNodes[19]).ToString()), int.Parse(action(node.ChildNodes[23]).ToString()));//Nave(node.ChildNodes[7], node.ChildNodes[7]); result = nuevanave; break; } case "def": { //por ser un terminal se retorna su valor como tal. var nuevadef = new defensa(); result = nuevadef; break; } case "ene": { var nuevoene = new enemigo(); result = nuevoene; break; } } return(result); }
// Use this for initialization void Start() { ctr = GameObject.Find("enemigo").GetComponent <enemigo>(); }
static void Main(string[] args) { enemigo Enemigo = new enemigo(); }