public void Visit(LetInNode node) { var scopeLet = scope.CreateChild(); foreach (var expInit in node.propertyLet) { expInit.expr_body.Accept(new SemanticVisit(errors, scopeLet)); var typeAssignExp = expInit.expr_body.staticType; if (!scopeLet.IsDefinedType(expInit.formal.type.Text, out TypeInfo typeDeclared)) { errors.Add(ErrorSemantic.NotDeclaredType(expInit.formal.type)); } if (!(typeAssignExp <= typeDeclared)) { errors.Add(ErrorSemantic.CannotConvert(expInit.formal.type, typeAssignExp, typeDeclared)); } if (scopeLet.IsDefined(expInit.formal.id.text, out TypeInfo typeOld)) { scopeLet.UpdateType(expInit.formal.id.text, typeDeclared); } else { scopeLet.Define(expInit.formal.id.text, typeDeclared); } } node.exprBody.Accept(new SemanticVisit(errors, scopeLet)); node.staticType = node.exprBody.staticType; }
public void Visit(LetInNode node) { VariableManager.PushVariableCounter(); foreach (var property in node.propertyLet) { VariableManager.IncrementVariableCounter(); VariableManager.PushVariable(property.formal.id.text, property.formal.type.Text); VariableManager.PushVariableCounter(); property.Accept(this); VariableManager.PopVariableCounter(); } VariableManager.IncrementVariableCounter(); node.exprBody.Accept(this); foreach (var property in node.propertyLet) { VariableManager.PopVariable(property.formal.id.text); } VariableManager.PopVariableCounter(); if (object_return_type) { var type = node.staticType.Text; if (type == "Int" || type == "Bool" || type == "String") { Code.Add(new AssignStrToVarCodeLine(return_type, type)); } else { Code.Add(new AssignStrToVarCodeLine(return_type, "Object")); } } }
public override string Visit(LetInNode node) { Scope = Scope.CreateChildScope(node); var lets = node.Lets .Select(let => $"var {Visit(let)};\n") .ToArray(); var letsExprs = string.Join("", lets); var body = Visit(node.Body); var result = $"function () {{\n{letsExprs}\nreturn {body};\n}}()"; Scope = Scope.Parent; return(result); }
public override ASTN VisitLetIn([NotNull] LetInContext context) { LetInNode node = new LetInNode(context) { propertyLet = new List <PropertyNode>(), exprBody = VisitExpr(context.expr()) as ExprNode }; foreach (var property in context.property()) { node.propertyLet.Add(VisitProperty(property) as PropertyNode); } return(node); }
public void Visit(LetInNode node) { throw new NotImplementedException(); }