/* grammar */ PEG_PARSE(parse_peg_grammar, PEG_GRAMMAR_NODE, L"PEG grammar", SEQ(T(parse_peg_spacing), SEQ(PLUS(T(parse_peg_rule)), T(parse_peg_eof)))); PEG_PARSE(parse_peg_rule, PEG_RULE_NODE, L"PEG rule", SEQ(T(parse_peg_identifier), SEQ(QUES(T(parse_peg_literal)), SEQ(T(parse_peg_left_arrow), T(parse_peg_disjunction))))); PEG_PARSE(parse_peg_disjunction, PEG_DISJ_NODE, L"expression", SEQ(T(parse_peg_conjunction), STAR(SEQ(T(parse_peg_slash), T(parse_peg_conjunction))))); PEG_PARSE(parse_peg_conjunction, PEG_CONJ_NODE, L"term", PLUS(T(parse_peg_prefix_exp))); PEG_PARSE(parse_peg_prefix_exp, PEG_PREFIX_EXP_NODE, L"term", SEQ(QUES(DISJ(T(parse_peg_and), DISJ(T(parse_peg_not), T(parse_peg_hide)))), T(parse_peg_suffix_exp))); PEG_PARSE(parse_peg_suffix_exp, PEG_SUFFIX_EXP_NODE, L"term", SEQ(T(parse_peg_term), QUES(DISJ(DISJ(T(parse_peg_question), T(parse_peg_star)), T(parse_peg_plus))))); PEG_PARSE(parse_peg_term, PEG_TERM_NODE, L"term", DISJ(SEQ(T(parse_peg_identifier), BANG(SEQ(QUES(T(parse_peg_literal)), T(parse_peg_left_arrow)))), DISJ(SEQ(T(parse_peg_open), SEQ(T(parse_peg_disjunction), T(parse_peg_close))), DISJ(T(parse_peg_literal), DISJ(T(parse_peg_class), T(parse_peg_dot))))));
/* Executa o programa */ int Mepa::exec(){ int op; if(detalha) { p->imprime(); /* Imprime o programa */ } op = p->next(); while( op != PARA ) { if(detalha) { debug(); } switch(op) { /* Funcoes MEPA */ case 0: { AMEM(); break; } case 1: { ARMI(); break; } case 2: { ARMP(); break; } case 3: { ARMZ(); break; } case 4: { CHPP(); break; } case 5: { CHPR(); break; } case 6: { CMAF(); break; } case 7: { CMAG(); break; } case 8: { CMDF(); break; } case 9: { CMDG(); break; } case 10: { CMEF(); break; } case 11: { CMEG(); break; } case 12: { CMIF(); break; } case 13: { CMIG(); break; } case 14: { CMMA(); break; } case 15: { CMMF(); break; } case 16: { CMME(); break; } case 17: { CMNF(); break; } case 18: { CONJ(); break; } case 19: { CRCT(); break; } case 20: { CRCF(); break; } case 21: { CREG(); break; } case 22: { CREN(); break; } case 23: { CRVI(); break; } case 24: { CRVL(); break; } case 25: { CRVP(); break; } case 26: { DISJ(); break; } case 27: { DIVF(); break; } case 28: { DIVI(); break; } case 29: { DMEM(); break; } case 30: { DSVF(); break; } case 31: { DSVS(); break; } case 32: { ENTR(); break; } case 33: { IMPC(); break; } case 34: { IMPF(); break; } case 35: { IMPR(); break; } case 36: { INPP(); break; } case 37: { INVF(); break; } case 38: { INVR(); break; } case 39: { LEIT(); break; } case 40: { LEIF(); break; } case 41: { MULF(); break; } case 42: { MULT(); break; } case 43: { NEGA(); break; } case 44: { RTPR(); break; } case 45: { SOMA(); break; } case 46: { SOMF(); break; } case 47: { SUBT(); break; } case 48: { SUBF(); break; } default:{ cerr << "O programa executou uma operacao invalida." << endl; cerr << "i = " << p->getI() << endl; abort(); } } op = p->next(); } return 0; }