// Produção StatementDuasLinhas StatementNode* statementDuasLinhas(IdNode *idDuasLinhas){ //Produção Statement'' if ((lookahead == ASSIGN) || (lookahead == OPENBRA)){//Produção Destiny printf("Destiny\n"); if (lookahead == ASSIGN){ match(ASSIGN,followDestiny, NULL); ExpressionNode* expAssign = expression(); return new AssignNode(idDuasLinhas,expAssign); } else if (lookahead == OPENBRA){ match(OPENBRA,followDestiny, NULL); ExpressionNode* expAssign2 = expression(); match(CLOSEBRA,followDestiny, NULL); match(ASSIGN,followDestiny, NULL); ExpressionNode* expAssign3 = expression(); ArrayNode* arrayNd = new ArrayNode(idDuasLinhas,expAssign2); return new AssignNode(arrayNd,expAssign3); }else {emiteErroSintatico(ERRO_TOKEN_INVALIDO,lookahead,retornaLinha()); return NULL;} }else if (lookahead == OPENPAR){//Produção Fragcall printf("Fragcall\n"); match(OPENPAR,followFragcall, NULL); ExpressionListNode* expListFRC = expressionList(); match(CLOSEPAR,followFragcall, NULL); return new FragCallNode(idDuasLinhas,expListFRC); }else return new NameDeclNode(NULL,new IdListNode(idDuasLinhas)); //Fim Produção statementDuasLinhas }
Lexeme *parenExpr(Parser *p) { Lexeme *a, *b = NULL, *e = NULL; match(p,OPAREN); a = expression(p); match(p,CPAREN); if(check(p,OPAREN)) { match(p,OPAREN); if(expressionListPending(p)) { b = expressionList(p); } match(p,CPAREN); return cons(FUNCCALL,a,b); } else if(check(p,OB)) { match(p,OBRACE); b = expression(p); match(p,CBRACE); return cons(ARRAYCALL,a,b); } else if(check(p,DOT)) { b = match(p,DOT); e = primary(p); b->left = a; if(!strcmp(e->type,FUNCCALL)) { b->right = e->left; e->left = b; return e; } b->right = e; return b; } return a; }
Lexeme *expressionList(Parser *p) { Lexeme *a, *b = NULL; a = expression(p); if(check(p,COMMA)) { match(p,COMMA); b = expressionList(p); } return cons(JOIN,a,b); }
//Produção Statement StatementNode* statement(){ printf("Statement\n"); if (lookahead == ID){ int lexema = retornaIndiceLexemaAtual(); REGISTRO *regi = retornaRegistroAtual(); IdNode* idStm = new IdNode(lexema, regi); match(ID, followStatement, &lexema); return statementDuasLinhas(idStm); }else if (lookahead == IF){ match(IF,followStatement, NULL); ExpressionNode* exp = expression(); StatementNode* stmt = statement(); StatementNode* stmtLinha = statementLinha(); return new IfNode(exp, stmt, stmtLinha); }else if (lookahead == WHILE){ match(WHILE,followStatement, NULL); ExpressionNode* exp = expression(); StatementNode* stmt = statement(); return new WhileNode(exp, stmt); }else if (lookahead == WRITE){ match(WRITE,followStatement, NULL); match(OPENPAR,followStatement, NULL); ExpressionListNode* expList = expressionList(); match(CLOSEPAR,followStatement, NULL); return new WriteNode(expList); }else if (lookahead == READ){ match(READ,followStatement, NULL); match(OPENPAR,followStatement, NULL); ExpressionListNode* expList = expressionList(); match(CLOSEPAR,followStatement, NULL); return new ReadNode(expList); }else if (lookaheadPertenceFirst(NameDecl) == 1){ return namedecl(); }else if (lookaheadPertenceFirst(Fragment) == 1){ return fragment(); }else { emiteErroSintatico(ERRO_TOKEN_INVALIDO,lookahead,retornaLinha()); return NULL;} }
//Produção Factor' ExpressionNode* factorLinha(IdNode* idN){ printf("Factor'\n"); if (lookahead == OPENBRA ){ match(OPENBRA,followFactorLinha, NULL); ExpressionNode* arrayExp = expression(); match(CLOSEBRA,followFactorLinha, NULL); return new ArrayNode(idN,arrayExp); }else if (lookahead == OPENPAR ){ match(OPENPAR,followFactorLinha, NULL); ExpressionListNode* vCallExp = expressionList(); match(CLOSEPAR,followFactorLinha, NULL); return new CallNode(idN,vCallExp); }else return idN; }
// primary: primitive // | idExpr // | parenExpr // | OB optExpressionList CB // | anonFunc Lexeme *primary(Parser *p) { if(primitivePending(p)) { return primitive(p); } else if(idExprPending(p)) { return idExpr(p); } else if(parenExprPending(p)) { return parenExpr(p); } else if(uOpPending(p)) { Lexeme *a = uOp(p); a->right = primary(p); return a; } else if(check(p,OB)) { Lexeme *a = lexeme(ARRAY); match(p,OB); if(expressionListPending(p)) { a->right = expressionList(p); } match(p,CB); return a; } else { return anonFunc(p); } }