示例#1
0
        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"));
                }
            }
        }
示例#3
0
        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();
 }