public void Visit(NForStmt nForStmt)
        {
            ++nestedLoopCount;
            Token  anchorToken = nForStmt.AnchorToken;
            string lexeme      = anchorToken.Lexeme;

            if (currentFunction.GetLocalVariableSymbolByLexeme(lexeme) == null && semanticAnalyzer.GetGlobalVariableSymbolByLexeme(lexeme) == null)
            {
                throw new SemanticError("Variable not in scope", anchorToken);
            }
            GenericChildVisitor(nForStmt);
            --nestedLoopCount;
        }
Exemplo n.º 2
0
//------------------------------------------------------------
        public void Visit(NForStmt node)
        {
            Console.WriteLine($"+++++++++++++++ NForStmt ++++++++++++++++");
            if (pasones == 2)
            {
                inloop++;
            }
            VisitChildren(node);
            if (pasones == 2)
            {
                inloop--;
            }
        }
Exemplo n.º 3
0
        // Returns NForStmt
        public Node ForStmt()
        {
            Expect(TokenCategory.FOR);
            Expect(TokenCategory.PARENTHESIS_LEFT);
            NForStmt nForStmt = new NForStmt()
            {
                AnchorToken = Expect(TokenCategory.IDENTIFIER)
            };

            Expect(TokenCategory.IN);
            nForStmt.Add(Expr());
            Expect(TokenCategory.PARENTHESIS_RIGHT);
            Expect(TokenCategory.CURLY_BRACE_LEFT);
            NStmtList nStmtList = new NStmtList();

            while (firstOfStatement.Contains(CurrentToken))
            {
                Stmt(nStmtList);
            }
            nForStmt.Add(nStmtList);
            Expect(TokenCategory.CURLY_BRACE_RIGHT);
            return(nForStmt);
        }
Exemplo n.º 4
0
        public string Visit(NForStmt nForStmt)
        {
            Token  anchorToken = nForStmt.AnchorToken;
            string lexeme      = anchorToken.Lexeme;
            string retVal      = "";

            string continueLabel = GenerateLabel();
            string breakLabel    = GenerateLabel();

            string lastContinueLabel = currentContinueLabel;
            string lastBreakLabel    = currentBreakLabel;

            currentContinueLabel = continueLabel;
            currentBreakLabel    = breakLabel;

            string      sizeLocalVariable = GenerateLabel();
            VariableSym sizeLocalVarSym   = new VariableSym(sizeLocalVariable, VariableSymKind.REGULAR);

            currentFunction.AddLocalVariable(sizeLocalVarSym);
            retVal += "\t\t.locals init (int64 '" + sizeLocalVariable + "')\n";

            string      indexLocalVariable = GenerateLabel();
            VariableSym indexLocalVarSym   = new VariableSym(indexLocalVariable, VariableSymKind.REGULAR);

            currentFunction.AddLocalVariable(indexLocalVarSym);
            retVal += "\t\t.locals init (int64 '" + indexLocalVariable + "')\n";

            string      arrayHandleLocalVariable = GenerateLabel();
            VariableSym arrayHandleLocalVarSym   = new VariableSym(arrayHandleLocalVariable, VariableSymKind.REGULAR);

            currentFunction.AddLocalVariable(arrayHandleLocalVarSym);
            retVal += "\t\t.locals init (int64 '" + arrayHandleLocalVariable + "')\n";

            Node nExpr     = nForStmt[0];
            Node nStmtList = nForStmt[1];

            retVal += Visit((dynamic)nExpr);
            retVal += storeVariable(arrayHandleLocalVariable);
            retVal += loadVariable(arrayHandleLocalVariable);
            retVal += "\t\tcall int64 class ['int64lib']'Int64'.'Utils'::'size'(int64)\n";
            retVal += storeVariable(sizeLocalVariable);
            retVal += "\t\tldc.i8 -1\n";
            retVal += storeVariable(indexLocalVariable);
            retVal += continueLabel + ":\n";
            retVal += loadVariable(indexLocalVariable);
            retVal += "\t\tldc.i8 1\n";
            retVal += "\t\tadd\n";
            retVal += storeVariable(indexLocalVariable);
            retVal += loadVariable(indexLocalVariable);
            retVal += loadVariable(sizeLocalVariable);
            retVal += "\t\tclt\n";
            retVal += "\t\tbrfalse " + breakLabel + "\n";
            retVal += loadVariable(arrayHandleLocalVariable);
            retVal += loadVariable(indexLocalVariable);
            retVal += "\t\tcall int64 class ['int64lib']'Int64'.'Utils'::'get'(int64, int64)\n";
            retVal += storeVariable(lexeme);
            retVal += Visit((dynamic)nStmtList);
            retVal += "\t\tbr " + continueLabel + "\n";
            retVal += breakLabel + ":\n";

            currentContinueLabel = lastContinueLabel;
            currentBreakLabel    = lastBreakLabel;

            return(retVal);
        }