public IHolderCil Visit(WhileExprContext parserRule, IFunctionCil cilTree, IContextCil contextCil) { var whileElse = cilTree.CreateLabel("while"); //Voy para esa etiqueta para evaluar la cod del while cilTree.ThreeDirInses.Add(new GotoCil(whileElse)); var loop = cilTree.CreateLabel("loop"); //Esta etiqueta indica evalua el cuerpo de while cilTree.ThreeDirInses.Add(new Label(loop)); Visit(parserRule.loopExpr, cilTree, contextCil); //Pongo la etiqueta de while cilTree.ThreeDirInses.Add(new Label(whileElse)); var condValue = Visit(parserRule.whileExpr, cilTree, contextCil); condValue = GetValue(condValue, cilTree, CilAst.Bool); cilTree.ThreeDirInses.Add(new IfGoto(condValue, loop)); //retorno el valor var value = Visit_void(cilTree); return(value); }
//No se si en el while si algun tipo no esta definido cambio su tipo estatico public void Visit(WhileExprContext parserRule, IObjectContext <IVar, IVar> context) { Visit(parserRule.whileExpr, context); Visit(parserRule.loopExpr, context); //Si la expresion ifExpr es undefined devuelvo como tipo estatico undefined if (!globalContext.IfDefineType(parserRule.whileExpr.computedType)) { parserRule.computedType = globalContext.Undefined; } else if (!parserRule.whileExpr.computedType.Equals(globalContext.Bool)) { errorLogger.LogError($"({parserRule.whileExpr.Start.Line},{parserRule.whileExpr.Start.Column + 1}) - TypeError: The predicate of the while must have static type 'Bool', not '{parserRule.whileExpr.computedType.Name}'"); parserRule.computedType = globalContext.Undefined; } //verifico si la expresion loopExpr es undefined else if (!globalContext.IfDefineType(parserRule.loopExpr.computedType)) { parserRule.computedType = globalContext.Undefined; } else//Si al menos uno es undefined entonces el tipo estatico lo sera { parserRule.computedType = globalContext.Object; } }