public bool Visit(AST_CaseOf node) { if (!node.expr.Visit(this)) { return(false); } var types = new List <SemanticType>(); foreach (var item in node.props.Propertys) { CurrContext = CurrContext.CreateChild(); if (!item.decl.Visit(this)) { if (!CurrContext.NullFather()) { CurrContext = CurrContext.GetParent(); } return(false); } if (!item.exp.Visit(this)) { if (!CurrContext.NullFather()) { CurrContext = CurrContext.GetParent(); } return(false); } CurrContext = CurrContext.GetParent(); types.Add(item.exp.MyType); } SemanticType lca = types[0]; for (int i = 1; i < types.Count; i++) { lca = SemanticType.LCA(lca, types[i]); } node.MyType = lca; return(true); }
public bool Visit(AST_CaseOf node) { if (!node.expr.Visit(this)) { return(false); } foreach (var item in node.props.Propertys) { if (!item.exp.Visit(this)) { return(false); } if (!item.decl.id.Visit(this)) { return(false); } } return(true); }
public bool Visit(AST_CaseOf node) { if (!(node.expr is AST_Id) && !node.expr.Visit(this)) { return(false); } foreach (var item in node.props.Propertys) { CurrContext = CurrContext.CreateChild(); CurrContext.Define(item.decl.id.Id); if (!item.exp.Visit(this)) { return(false); } CurrContext = CurrContext.GetParent(); } return(true); }
public string Visit(AST_CaseOf node) { var s = node.expr.Visit(this); var solve = methodcontext.GenLocal("exp", true); var typexpr = methodcontext.GenLocal("get_type", true); var besti = methodcontext.GenLocal("best_type", true); var cmp = methodcontext.GenLocal("comp", true); methodcontext.Staments.Add(new CIL_TypeOf(s, typexpr)); var endlab = methodcontext.GenLabel("end"); methodcontext.Staments.Add(new CIL_ExceptionCond(typexpr, "0", "error_null")); methodcontext.Staments.Add(new CIL_Asig(besti, "10000", "Int")); List <string> typeval = new List <string>(); foreach (var item in node.props.Propertys) { typeval.Add(methodcontext.GenLocal("type", true)); } for (int i = 0; i < typeval.Count; i++) { methodcontext.Staments.Add(new CIL_TypeOf(node.props.Propertys[i].decl.type.Type, typeval[i])); methodcontext.Staments.Add(new CIL_FunctionCall("descend", new CIL_Params(new List <string> { typeval[i], typexpr }), null, typeval[i], false, null)); methodcontext.Staments.Add(new CIL_ExpBin(besti, typeval[i], "<", cmp)); var iff = methodcontext.GenLabel("if"); methodcontext.Staments.Add(new CIL_If_Goto(cmp, iff)); methodcontext.Staments.Add(new CIL_Asig(besti, typeval[i], "var")); methodcontext.Staments.Add(new CIL_Label(iff)); } List <string> labelsok = new List <string>(); for (int i = 0; i < typeval.Count; i++) { labelsok.Add(methodcontext.GenLabel("ok")); } methodcontext.Staments.Add(new CIL_ExceptionCond(besti, "10000", "error_null")); for (int i = 0; i < typeval.Count; i++) { methodcontext.Staments.Add(new CIL_ExpBin(besti, typeval[i], "=", cmp)); methodcontext.Staments.Add(new CIL_If_Goto(cmp, labelsok[i])); } for (int i = 0; i < typeval.Count; i++) { methodcontext.Staments.Add(new CIL_Label(labelsok[i])); methodcontext.AddContext("case"); string id = methodcontext.GenLocal(node.props.Propertys[i].decl.id.Id, false); methodcontext.Staments.Add(new CIL_Asig(id, s, "var")); string idexp = node.props.Propertys[i].exp.Visit(this); methodcontext.Staments.Add(new CIL_Asig(solve, idexp, "var")); methodcontext.ClearContext(); methodcontext.Staments.Add(new CIL_Goto(endlab)); } methodcontext.Staments.Add(new CIL_Label(endlab)); return(solve); }
public bool Visit(AST_CaseOf node) { throw new NotImplementedException(); }
public Base_Object_Value Visit(AST_CaseOf node) { throw new NotImplementedException(); }