public void Visit(LetNode node)
        {
            VariableManager.PushVariableCounter();

            foreach (var attr in node.Initialization)
            {
                VariableManager.IncrementVariableCounter();
                VariableManager.PushVariable(attr.Formal.Id.Text, attr.Formal.Type.Text);
                VariableManager.PushVariableCounter();
                attr.Accept(this);
                //IntermediateCode.Add(new AssignmentVariableToVariable(VariableManager.PeekVariableCounter(), VariableManager.VariableCounter));
                VariableManager.PopVariableCounter();
            }
            VariableManager.IncrementVariableCounter();

            node.ExpressionBody.Accept(this);

            foreach (var attr in node.Initialization)
            {
                VariableManager.PopVariable(attr.Formal.Id.Text);
            }
            VariableManager.PopVariableCounter();

            if (special_object_return_type)
            {
                SetReturnType(node.StaticType.Text);
            }
        }
Exemple #2
0
        public void Visit(LetNode node)
        {
            var scopeLet = scope.CreateChild();

            foreach (var expInit in node.Initialization)
            {
                expInit.AssignExp.Accept(new Tour2(scopeLet, errors));
                var typeAssignExp = expInit.AssignExp.StaticType;

                if (!scopeLet.IsDefinedType(expInit.Formal.Type.Text, out TypeInfo typeDeclared))
                {
                    errors.Add(SemanticError.NotDeclaredType(expInit.Formal.Type));
                }

                if (!(typeAssignExp <= typeDeclared))
                {
                    errors.Add(SemanticError.CannotConvert(expInit.Formal.Type, typeAssignExp, typeDeclared));
                }

                if (scopeLet.IsDefined(expInit.Formal.Id.Text, out TypeInfo typeOld))
                {
                    scopeLet.Change(expInit.Formal.Id.Text, typeDeclared);
                }
                else
                {
                    scopeLet.Define(expInit.Formal.Id.Text, typeDeclared);
                }
            }

            node.ExpressionBody.Accept(new Tour2(scopeLet, errors));
            node.StaticType = node.ExpressionBody.StaticType;
        }
        public void Visit(LetNode node)
        {
            VariableManager.PushVariableCounter();

            foreach (var attr in node.Initialization)
            {
                VariableManager.IncrementVariableCounter();
                VariableManager.PushVariable(attr.Formal.Id.Text, attr.Formal.Type.Text);
                VariableManager.PushVariableCounter();
                attr.Accept(this);

                VariableManager.PopVariableCounter();
            }
            VariableManager.IncrementVariableCounter();

            node.ExpressionBody.Accept(this);

            foreach (var attr in node.Initialization)
            {
                VariableManager.PopVariable(attr.Formal.Id.Text);
            }
            VariableManager.PopVariableCounter();

            if (object_return_type)
            {
                SetReturnType(node.StaticType.Text);
            }
        }
Exemple #4
0
        public override Node VisitLet([NotNull] TigerParser.LetContext context)
        {
            var node = new LetNode(context);

            TigerParser.DeclsContext[] decls = context.decls();
            var declarations = new DeclarationListNode(decls[0]);

            declarations.Children.AddRange(from d in decls select Visit(d)); // declaration list -> DECLARATION+
            node.Children.Add(declarations);                                 // DECLARATION LIST

            TigerParser.ExprContext[] exprs = context.expr();

            ExpressionSeqNode expressions;

            if (exprs.Length > 0)
            {
                expressions = new ExpressionSeqNode(exprs[0]);
            }
            else
            {
                expressions = new ExpressionSeqNode(-1, -1);
            }

            expressions.Children.AddRange(from e in exprs select Visit(e)); // expression sequence -> EXPRESSION*
            node.Children.Add(expressions);                                 // EXPRESSION SEQUENCE

            return(node);
        }
Exemple #5
0
        public void TestLetNodeNoEqualOperator()
        {
            string        t  = "#{let c   tuple[x:3, y:5]}";
            LexicalParser lp = new LexicalParser();

            lp.SetParseContent(t);
            var     tokens = lp.Parse();
            LetNode l      = new LetNode(tokens[0]);
        }
Exemple #6
0
        public void TestLetNodeNoExpr()
        {
            string        t  = "#{let c=   }";
            LexicalParser lp = new LexicalParser();

            lp.SetParseContent(t);
            var     tokens = lp.Parse();
            LetNode l      = new LetNode(tokens[0]);
        }
Exemple #7
0
        public override ASTNode VisitLetIn([NotNull] CoolParser.LetInContext context)
        {
            LetNode node = new LetNode(context)
            {
                Initialization = (from x in context.property() select Visit(x) as AttributeNode).ToList(),
                ExpressionBody = Visit(context.expression()) as ExpressionNode
            };

            return(node);
        }
        public void GenerateCode(LetNode node, ICIL_CodeGenerator codeGenerator)
        {
            node.Holder = codeGenerator.DefineVariable();
            codeGenerator.AddLocalVariable(
                new CIL_LocalVariable((Variable)node.Holder));

            GenerateCode(node.LetExprs, codeGenerator);
            GenerateCode(node.Expression, codeGenerator);

            codeGenerator.AddInstruction(
                new Assign((Variable)node.Holder, node.Expression.Holder));
        }
Exemple #9
0
        public void TestLetNode()
        {
            string        t  = "#{let c = tuple[x:3, y:5]}";
            LexicalParser lp = new LexicalParser();

            lp.SetParseContent(t);
            var     tokens = lp.Parse();
            LetNode l      = new LetNode(tokens[0]);

            Assert.AreEqual("c", l.VarName);
            Assert.AreEqual("tuple[x:3, y:5]", l.Expression);
        }
Exemple #10
0
        Node expr()
        {
            switch (currToken.Type)
            {

                case TokenType.IDE:
                    return ide();

                case TokenType.LET:

                    Env savedEnv = top;
                    top = new Env(top);

                    Token letToken = match(currToken.Type);
                    IdeNode id = ide();
                    match(TokenType.EQUAL);
                    Node definition = expr();
                    top.Put(id.Token, definition.eval());

                    match(TokenType.IN);
                    Node body = expr();

                    LetNode let = new LetNode(letToken, id, definition, body, top);

                    top = savedEnv;

                    return let;

                case TokenType.AND:
                    Token andToken = match(currToken.Type);
                    match(TokenType.OPENB);

                    AndNode and = new AndNode(andToken);

                    while (currToken.Type != TokenType.CLOSEB)
                    {
                        and.addExpression(expr());

                        if (currToken.Type != TokenType.CLOSEB)
                            match(TokenType.COMMA);
                    }
                    match(TokenType.CLOSEB);
                    return and;

                case TokenType.BOOL:
                    return new Node(match(currToken.Type));

                default:
                    Error("Error: invalid token: " + currToken.Type.ToString());
                    return null;
            }
        }
Exemple #11
0
        public override string Visit(LetNode node)
        {
            var symbol = Scope.FindVariableInCurrent(node.Id);

            if (symbol != null)
            {
                AddError(Error.ErrorLevel.Error, node, $"Variable `{node.Id}` already exists.");
            }

            symbol = Scope.AddVariable(node.Id, node);
            var left = symbol.AbsoluteName();

            var right = Visit(node.Expr);

            if (right == null)
            {
                AddError(Error.ErrorLevel.Error, node, $"Variable `{node.Id}` has no value defined.");
            }

            return($"{left} = {right}");
        }
 public void CheckSemantic(LetNode node, IScope scope = null)
 {
     CheckSemantic(node.LetExprs, scope);
     CheckSemantic(node.Expression, scope);
     node.ComputedType = node.Expression.ComputedType;
 }
Exemple #13
0
        /// <summary>
        /// let_stmt                                    = "let" identifier "=" expr
        /// </summary>
        private LetNode parseLetStmt()
        {
            if (!check(LexemType.Let))
                return null;

            var node = new LetNode();
            node.Name = ensure(LexemType.Identifier, ParserMessages.VarIdentifierExpected).Value;
            ensure(LexemType.Assign, ParserMessages.SymbolExpected, '=');
            node.Value = ensure(parseExpr, ParserMessages.InitExpressionExpected);

            return node;
        }
Exemple #14
0
 public void Visit(LetNode node)
 {
     throw new NotImplementedException();
 }
Exemple #15
0
        private Node ParseParagraph()
        {
            Token <TokenType> t    = PeekNextToken();
            ParaNode          node = new ParaNode();

            while (!t.End)
            {
                switch (t.TokenType)
                {
                case TokenType.If:
                    node.ParamNodes.Add(ParseIfBlock());
                    break;

                case TokenType.For:
                    node.ParamNodes.Add(ParseForBlock());
                    break;

                case TokenType.Let:
                    LetNode let = new LetNode(GetNextToken());
                    node.ParamNodes.Add(let);
                    break;

                case TokenType.Remark:
                    RemarkNode rem = new RemarkNode(GetNextToken());
                    node.ParamNodes.Add(rem);
                    break;

                case TokenType.Expression:
                case TokenType.Text:
                    SimpleNode sNode = new SimpleNode(GetNextToken());
                    node.ParamNodes.Add(sNode);
                    break;

                case TokenType.Include:
                    IncludeNode include = new IncludeNode(GetNextToken());
                    node.ParamNodes.Add(include);
                    break;

                case TokenType.Else:    //Note: if next token is else, then the trueNode of if is finished.
                case TokenType.End:
                    if (node.ParamNodes.Count == 1)
                    {
                        return(node.ParamNodes[0]);
                    }
                    else
                    {
                        return(node);
                    }

                case TokenType.Break:
                    GetNextToken();
                    node.ParamNodes.Add(new BreakNode());
                    break;

                case TokenType.Continue:
                    GetNextToken();
                    node.ParamNodes.Add(new ContinueNode());
                    break;
                }

                t = PeekNextToken();
            }

            if (node.ParamNodes.Count == 1)
            {
                return(node.ParamNodes[0]);
            }
            else
            {
                return(node);
            }
        }