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; }
//------------------------------------------------------------ public void Visit(NForStmt node) { Console.WriteLine($"+++++++++++++++ NForStmt ++++++++++++++++"); if (pasones == 2) { inloop++; } VisitChildren(node); if (pasones == 2) { inloop--; } }
// 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); }
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); }