public void CheckSemantics(Scope scope, Report report, FieldDecNode node)//se le pasa el nodo que estaba en la declaracion del record { if (id.name != node.id.name) { report.Add(Line, CharPositionInLine, string.Format("Record's field's names must be identical")); returnType = scope.FindType("error"); return; } expr.CheckSemantics(scope, report); if (expr.returnType.isError) { returnType = scope.FindType("error"); return; } TypeInfo info = scope.FindType(node.type.name);//Buscar el tipo de retorno que se designo en la declaracion del record if (info == null) { report.Add(node.Line, node.CharPositionInLine, string.Format("Cant find type {0}", node.type.name)); returnType = scope.FindType("error"); return; } if (!info.Alike(expr.returnType)) { report.Add(Line, CharPositionInLine, string.Format("Cant assign {0} to {1}", info.name, expr.returnType.name)); returnType = scope.FindType("error"); } returnType = scope.FindType("void"); }
public void GenerateFunction(CodeGenerator cg) { var params_ = new List <Type>(); foreach (var item in paramsTypes) { params_.Add(item.GetType(cg)); } FunctionInfo info = funcScope.FindFunction(id.name); builder = cg.typeBuilder.DefineMethod(info.ConvertedName, System.Reflection.MethodAttributes.Public | System.Reflection.MethodAttributes.Static, CallingConventions.Standard, functionReturnType.GetType(cg), params_.ToArray()); //buscar las variables para los parametros que recibira y crearlas si no existian for (int i = 0; i < paramList.parameters.Count; i++) { FieldDecNode currentField = paramList.parameters[i]; VariableInfo current = funcScope.ShortFindVariable(currentField.id.name); current.Create(cg); } }
public FieldDecNode(FieldDecNode n) : base(n) { }