public TypeG Visit(CallNode node) { Console.WriteLine("INICIO" + node.ToStringTree()); VisitChildren(node); Console.WriteLine("FIN"); var name = node.AnchorToken.Lexeme; var parametersRequired = 0; TypeG typeRequired = TypeG.VOID; TypeG typeRequired2 = TypeG.VOID; TypeG returnType = TypeG.VOID; switch (name) { case "WrInt": parametersRequired = 1; typeRequired = TypeG.INTEGER; break; case "WrStr": parametersRequired = 1; typeRequired = TypeG.STRING; break; case "WrLn": break; case "RdInt": returnType = TypeG.INTEGER; break; case "RdStr": returnType = TypeG.STRING; break; case "AtStr": parametersRequired = 2; typeRequired = TypeG.STRING; typeRequired2 = TypeG.INTEGER; returnType = TypeG.STRING; break; case "LenStr": parametersRequired = 1; typeRequired = TypeG.STRING; returnType = TypeG.INTEGER; break; case "CmpStr": parametersRequired = 2; typeRequired = TypeG.STRING; typeRequired2 = TypeG.STRING; returnType = TypeG.INTEGER; break; case "CatStr": parametersRequired = 2; typeRequired = TypeG.STRING; typeRequired2 = TypeG.STRING; returnType = TypeG.STRING; break; case "LenLstInt": parametersRequired = 1; typeRequired = TypeG.INTEGER_LIST; returnType = TypeG.INTEGER; break; case "LenLstStr": parametersRequired = 1; typeRequired = TypeG.STRING_LIST; returnType = TypeG.INTEGER; break; case "LenLstBool": parametersRequired = 1; typeRequired = TypeG.BOOLEAN_LIST; returnType = TypeG.INTEGER; break; case "NewLstInt": parametersRequired = 1; typeRequired = TypeG.INTEGER; returnType = TypeG.INTEGER_LIST; break; case "NewLstStr": parametersRequired = 1; typeRequired = TypeG.INTEGER; returnType = TypeG.STRING_LIST; break; case "NewLstBool": parametersRequired = 1; typeRequired = TypeG.INTEGER; returnType = TypeG.BOOLEAN_LIST; break; case "IntToStr": parametersRequired = 1; typeRequired = TypeG.INTEGER; returnType = TypeG.STRING; break; case "StrToInt": parametersRequired = 1; typeRequired = TypeG.STRING; returnType = TypeG.INTEGER; break; default: throw new Exception($"Function {name} has no declared call"); } if (parametersRequired > 0) { dynamic tipo = Visit((dynamic)node[0]); if (node.getLength() == parametersRequired) { if (typeRequired == tipo) { return(returnType); } else { throw new SemanticError($"No type match for Call: " + $"expected {typeRequired} but got {tipo}", node.AnchorToken); } } else { throw new SemanticError($"Wrong number of params to procedure call: " + $"expected {parametersRequired} but got {node.getLength()}", node.AnchorToken); } } return(TypeG.VOID); }