Ejemplo n.º 1
0
// 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
      
}      
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
//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;}
}
Ejemplo n.º 5
0
//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;

}
Ejemplo n.º 6
0
// 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);
  }
}