public statementAST parseStat() { //Statement //case id designatorAST desig = null; exprAST expr = null; actParsAST actP = null; designatorStatementAumentoAST aum = null; designatorStatementDecrementoAST decr = null; Boolean actPBoo = false; //case if conditionAST condi = null; statementAST stat = null; statementAST stat2 = null; Boolean elseBoo = false; listStatementsAST tempStat,tempStat2, result; exprAST forexpr1 = null; conditionAST forexpr2 = null; exprAST forexpr3 = null; statementAST forstat = null; switch (currentToken.sym) { case sym.ID: { desig=parseDesignator(); switch (currentToken.sym) { case sym.IGUAL: { acceptIt(); expr=parseExpr(); break; } case sym.P_ABI: { acceptIt(); if (currentToken.sym == sym.RES || currentToken.sym == sym.ID || currentToken.sym == sym.NUM || currentToken.sym == sym.CHARCONS || currentToken.sym == sym.TRUE || currentToken.sym == sym.FALSE || currentToken.sym == sym.NEW || currentToken.sym == sym.P_ABI) { actP=parseActPars(); actPBoo = true; } accept(sym.P_CER, ")"); break; } case sym.SUM_SUM: { aum = new designatorStatementAumentoAST(); acceptIt(); break; } case sym.IGU_IGU: { decr = new designatorStatementDecrementoAST(); acceptIt(); break; } accept(sym.PYCOMA, ";"); //Designator ( "=" Expr | "(" [ ActPars ] ")" | "++" | "--" ) ";" } if (expr != null) { return new designatorStatementAsignacionAST(expr); } else if (actP != null) { return new designatorStatementUnActParsAST(actP); //revisar } else if (actPBoo == true) { return new designatorStatementUnActParsAST(actP); //revisar } else if (actPBoo==false) //analizar posible fallo { return new designatorStatementSinActParsAST(); } break; } case sym.IF: { accept(sym.IF, "if"); accept(sym.P_ABI, "("); condi=parseCondition(); accept(sym.P_CER, ")"); stat=parseStat(); //tempStat = new unStatementAST(stat); if (currentToken.sym == sym.ELSE) { elseBoo=true; stat2 = parseStat(); } if (elseBoo == true) { return new ifStatementConELseAST (condi,stat,stat2); } else { return new ifStatementSinELseAST(condi,stat); } break; } case sym.FOR: { accept(sym.FOR, "for"); accept(sym.P_ABI, "("); forexpr1=parseExpr(); accept(sym.PYCOMA, ";"); if (currentToken.sym == sym.RES || currentToken.sym == sym.ID || currentToken.sym == sym.NUM || currentToken.sym == sym.CHARCONS || currentToken.sym == sym.TRUE || currentToken.sym == sym.FALSE || currentToken.sym == sym.NEW || currentToken.sym == sym.P_ABI) { forexpr2 = parseCondition(); } accept(sym.PYCOMA, ";"); if (currentToken.sym == sym.RES || currentToken.sym == sym.ID || currentToken.sym == sym.NUM || currentToken.sym == sym.CHARCONS || currentToken.sym == sym.TRUE || currentToken.sym == sym.FALSE || currentToken.sym == sym.NEW || currentToken.sym == sym.P_ABI) { forexpr3=parseExpr(); } accept(sym.PYCOMA, ";"); forstat=parseStat(); if(forexpr2!=null && forexpr3==null){ return new forStatementConConditionAST(forexpr1, forexpr2,forstat); } if (forexpr3 != null && forexpr2==null) { return new forStatementConFuntionAST(forexpr1, forexpr3, forstat); } if (forexpr3 == null && forexpr2==null) { return new forStatementSoloDeclAST(forexpr1, forstat); } if (forexpr3 != null && forexpr2!=null) { return new forStatementConCondFuntAST(forexpr1, forexpr2, forexpr3, forstat); } break; } case sym.WHILE: { accept(sym.WHILE, "WHILE"); accept(sym.P_ABI, "("); condi = parseCondition(); accept(sym.P_CER, ")"); stat = parseStat(); return new whileStatementAST(condi,stat); break; } case sym.BREAK: { accept(sym.PYCOMA); break; } case sym.RETURN: { Boolean ind=false; acceptIt(); if (currentToken.sym == sym.RES || currentToken.sym == sym.ID || currentToken.sym == sym.NUM || currentToken.sym == sym.CHARCONS || currentToken.sym == sym.TRUE || currentToken.sym == sym.FALSE || currentToken.sym == sym.NEW || currentToken.sym == sym.P_ABI) { expr=parseExpr(); ind=true; } accept(sym.PYCOMA, ";"); if (ind == true) { return new returnStatementConExprAST(expr); } else { return new returnStatementSinExprAST(); } break; } case sym.READ: { acceptIt(); accept(sym.P_ABI, "("); desig=parseDesignator(); accept(sym.P_CER, ")"); accept(sym.PYCOMA, ";"); return new readStatementAST(desig); //revisar este return break; } case sym.WRITE: { accept(sym.P_ABI, "("); expr=parseExpr(); Symbol tempsimbol=null; if (currentToken.sym == sym.COMA) { accept(sym.COMA, ","); tempsimbol=currentToken; accept(sym.NUM, "number"); } accept(sym.P_CER, ")"); accept(sym.PYCOMA, ";"); if (tempsimbol != null) { return new writeStatementConNumAST(tempsimbol, expr); } else { return new writeStatementSinNumAST(expr); } // "write" "(" Expr [ "," number ] ")" ";" } case sym.COR_A: { parseBlock(); break; } case sym.PYCOMA: { acceptIt(); break; } } return null; }
Object VisitDesignatorStatementAumentoAST(designatorStatementAumentoAST var, object arg) { int numaux = ((Integer)arg).intValue(); printtab(numaux); System.out.println(c.getClass().getName()); if(c.- !=null) c.-.visit(this,new Integer(numaux+1)); else{printtab(numaux+1); Console.WriteLine(“NULL”);} return null; }
public statementAST parseStat() { //Statement //case id designatorAST desig = null; exprAST expr = null; actParsAST actP = null; designatorStatementAumentoAST aum = null; designatorStatementDecrementoAST decr = null; Boolean actPBoo = false; //case if conditionAST condi = null; statementAST stat = null; statementAST stat2 = null; Boolean elseBoo = false; listStatementsAST tempStat, tempStat2, result; exprAST forexpr1 = null; conditionAST forexpr2 = null; exprAST forexpr3 = null; statementAST forstat = null; switch (currentToken.sym) { case sym.ID: { desig = parseDesignator(); switch (currentToken.sym) { case sym.IGUAL: { acceptIt(); expr = parseExpr(); break; } case sym.P_ABI: { acceptIt(); if (currentToken.sym == sym.RES || currentToken.sym == sym.ID || currentToken.sym == sym.NUM || currentToken.sym == sym.CHARCONS || currentToken.sym == sym.TRUE || currentToken.sym == sym.FALSE || currentToken.sym == sym.NEW || currentToken.sym == sym.P_ABI) { actP = parseActPars(); actPBoo = true; } accept(sym.P_CER, ")"); break; } case sym.SUM_SUM: { aum = new designatorStatementAumentoAST(); acceptIt(); break; } case sym.IGU_IGU: { decr = new designatorStatementDecrementoAST(); acceptIt(); break; } accept(sym.PYCOMA, ";"); //Designator ( "=" Expr | "(" [ ActPars ] ")" | "++" | "--" ) ";" } if (expr != null) { return(new designatorStatementAsignacionAST(expr)); } else if (actP != null) { return(new designatorStatementUnActParsAST(actP)); //revisar } else if (actPBoo == true) { return(new designatorStatementUnActParsAST(actP)); //revisar } else if (actPBoo == false) //analizar posible fallo { return(new designatorStatementSinActParsAST()); } break; } case sym.IF: { accept(sym.IF, "if"); accept(sym.P_ABI, "("); condi = parseCondition(); accept(sym.P_CER, ")"); stat = parseStat(); //tempStat = new unStatementAST(stat); if (currentToken.sym == sym.ELSE) { elseBoo = true; stat2 = parseStat(); } if (elseBoo == true) { return(new ifStatementConELseAST(condi, stat, stat2)); } else { return(new ifStatementSinELseAST(condi, stat)); } break; } case sym.FOR: { accept(sym.FOR, "for"); accept(sym.P_ABI, "("); forexpr1 = parseExpr(); accept(sym.PYCOMA, ";"); if (currentToken.sym == sym.RES || currentToken.sym == sym.ID || currentToken.sym == sym.NUM || currentToken.sym == sym.CHARCONS || currentToken.sym == sym.TRUE || currentToken.sym == sym.FALSE || currentToken.sym == sym.NEW || currentToken.sym == sym.P_ABI) { forexpr2 = parseCondition(); } accept(sym.PYCOMA, ";"); if (currentToken.sym == sym.RES || currentToken.sym == sym.ID || currentToken.sym == sym.NUM || currentToken.sym == sym.CHARCONS || currentToken.sym == sym.TRUE || currentToken.sym == sym.FALSE || currentToken.sym == sym.NEW || currentToken.sym == sym.P_ABI) { forexpr3 = parseExpr(); } accept(sym.PYCOMA, ";"); forstat = parseStat(); if (forexpr2 != null && forexpr3 == null) { return(new forStatementConConditionAST(forexpr1, forexpr2, forstat)); } if (forexpr3 != null && forexpr2 == null) { return(new forStatementConFuntionAST(forexpr1, forexpr3, forstat)); } if (forexpr3 == null && forexpr2 == null) { return(new forStatementSoloDeclAST(forexpr1, forstat)); } if (forexpr3 != null && forexpr2 != null) { return(new forStatementConCondFuntAST(forexpr1, forexpr2, forexpr3, forstat)); } break; } case sym.WHILE: { accept(sym.WHILE, "WHILE"); accept(sym.P_ABI, "("); condi = parseCondition(); accept(sym.P_CER, ")"); stat = parseStat(); return(new whileStatementAST(condi, stat)); break; } case sym.BREAK: { accept(sym.PYCOMA); break; } case sym.RETURN: { Boolean ind = false; acceptIt(); if (currentToken.sym == sym.RES || currentToken.sym == sym.ID || currentToken.sym == sym.NUM || currentToken.sym == sym.CHARCONS || currentToken.sym == sym.TRUE || currentToken.sym == sym.FALSE || currentToken.sym == sym.NEW || currentToken.sym == sym.P_ABI) { expr = parseExpr(); ind = true; } accept(sym.PYCOMA, ";"); if (ind == true) { return(new returnStatementConExprAST(expr)); } else { return(new returnStatementSinExprAST()); } break; } case sym.READ: { acceptIt(); accept(sym.P_ABI, "("); desig = parseDesignator(); accept(sym.P_CER, ")"); accept(sym.PYCOMA, ";"); return(new readStatementAST(desig)); //revisar este return break; } case sym.WRITE: { accept(sym.P_ABI, "("); expr = parseExpr(); Symbol tempsimbol = null; if (currentToken.sym == sym.COMA) { accept(sym.COMA, ","); tempsimbol = currentToken; accept(sym.NUM, "number"); } accept(sym.P_CER, ")"); accept(sym.PYCOMA, ";"); if (tempsimbol != null) { return(new writeStatementConNumAST(tempsimbol, expr)); } else { return(new writeStatementSinNumAST(expr)); } // "write" "(" Expr [ "," number ] ")" ";" } case sym.COR_A: { parseBlock(); break; } case sym.PYCOMA: { acceptIt(); break; } } return(null); }