bool operator != (const VT & vta, const VT & vtb) { ST sta (vta.begin (), vta.end ()); ST stb (vtb.begin (), vtb.end ()); return (sta != stb); }
/* show labels */ void debug_labels (VT tokens, map<string,int> labels) { cout << endl << " <===--- AVAILABLE LABELS ---===>" << endl << endl; VT::iterator tok; for (tok = tokens.begin(); tok != tokens.end(); tok++) { if ( tok->get_id() == CAAP ) { labels[ tok->get_param() ] = tok->get_pos(); cout << "L" << tok->get_pos() << " = " << tok->get_param() << endl; } } }
/* debug print as genome sequence */ void debug_print_as_genome(VT tokens) { cout << endl << " <===--- DEBUG PRINT AS GENOME SEQUENCE ---===>" << endl << endl; int linemanip = 0; VT::iterator tok; for (tok=tokens.begin(); tok != tokens.end(); tok++) { int id = tok->get_id(); cout << (char)(id + 'a'); linemanip++; if (linemanip%40==0) cout << endl; } cout << endl; }
VT LCS(VT& A, VT& B) { VVI dp; int n = A.size(), m = B.size(); dp.resize(n+1); for(int i=0; i<=n; i++) dp[i].resize(m+1, 0); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { if(A[i-1] == B[j-1]) dp[i][j] = dp[i-1][j-1]+1; else dp[i][j] = max(dp[i-1][j], dp[i][j-1]); } VT res; backtrack(dp, res, A, B, n, m); reverse(res.begin(), res.end()); return res; }
void debug_print(VT tokens, map<string,int> marks) { cout << endl << " <===--- ASSEMBLY LIKE PSEUDO CODE ---===>" << endl << endl; VT::iterator tok; for (tok=tokens.begin(); tok != tokens.end(); tok++) { int pos = tok->get_pos(); string param = tok->get_param(); cout << setw(4) << setfill('0') << pos << ": "; switch (tok->get_id()) { case AAP: cout << "AAP\tpush\t" << param << "(" << numerise(param) << ")" << endl; break; case ACA: cout << "ACA\t" << "dul\t" << endl; break; case ACB: cout << "ACB\t" << endl; break; case ACC: cout << "ACC\t" << "pop\t" << endl; break; case BBA: cout << "BBA\t" << "store" << endl; break; case BBB: cout << "BBB\t" << "retri" << endl; break; case BAAA: cout << "BAAA\t" << "add" << endl; break; case BAAB: cout << "BAAB\t" << "sub" << endl; break; case BAAC: cout << "BAAC\t" << endl; break; case BABA: cout << "BABA\t" << endl; break; case BABB: cout << "BABB\t" << endl; break; case CAAP: cout << "CAAP\t" << "label\tL" << marks[param] << endl; break; case CABP: cout << "CABP\t" << "call\tL" << marks[param] << endl; break; case CACP: cout << "CACP\t" << "jump\tL" << marks[param] << endl; break; case CBAP: cout << "CBAP\t" << "jmpz\tL" << marks[param] << endl; break; case CBBP: cout << "CBBP\t" << param << endl; break; case CBC: cout << "CBC\t" << "ret" << endl; break; case CCC: cout << "CCC\t" << "exit" << endl; break; case BCAA: cout << "BCAA" << "\t" << "puchr" << endl; break; case BCAB: cout << "BCAB\t" << endl; break; case BCBA: cout << "BCBA\t" << "rechr" << endl; break; case BCBB: cout << "BCBB\t" << endl; break; } } }
/* interprete */ void interprete (VT tokens, map<string, int> labels) { stack<int> st, pst; map<int,int> heap; VT::iterator tok; for (tok=tokens.begin(); tok != tokens.end(); tok++) { // print_token(tok, st, pst, heap); int ppos = tok->get_pos(); int left, right, tmp, jumpto; map<int, int>::iterator mit; VT::iterator t; switch(tok->get_id()) { case PUSH: st.push( numerise( tok->get_param() ) ); break; case DUPL: st.push( st.top() ); break; case SWAP: left = st.top(); st.pop(); right = st.top(); st.pop(); st.push(left); st.push(right); break; case POPL: st.pop(); break; case ADDB: right = st.top(); st.pop(); left = st.top(); st.pop(); st.push(left + right); break; case SUBB: right = st.top(); st.pop(); left = st.top(); st.pop(); st.push(left - right); break; case MULB: right = st.top(); st.pop(); left = st.top(); st.pop(); st.push(left * right); break; case DIVB: right = st.top(); st.pop(); left = st.top(); st.pop(); st.push((int)(left / right)); break; case MODB: right = st.top(); st.pop(); left = st.top(); st.pop(); st.push(left % right); break; case STOR: left = st.top(); st.pop(); right = st.top(); st.pop(); heap[ right ] = left; break; case RETR: tmp = st.top(); st.pop(); mit = heap.find( tmp ); if (mit != heap.end()) st.push( mit->second ); else st.push( 0 ); break; case SETL: break; case CALL: pst.push( ppos ); jumpto = labels[ tok->get_param() ]; for (t=tokens.begin(); t != tokens.end(); t++) { if (t->get_pos() == jumpto) { break; } } tok = t; break; case JUMP: jumpto = labels[ tok->get_param() ]; for (t=tokens.begin(); t != tokens.end(); t++) { if (t->get_pos() == jumpto) { break; } } tok = t; break; case JMPZ: tmp = st.top(); st.pop(); jumpto = labels[ tok->get_param() ]; if (tmp==0) { for (t=tokens.begin(); t != tokens.end(); t++) { if (t->get_pos() == jumpto) { break; } } tok = t; } break; case JMPN: tmp = st.top(); st.pop(); jumpto = labels[ tok->get_param() ]; if (tmp < 0) { for (t=tokens.begin(); t != tokens.end(); t++) { if (t->get_pos() == jumpto) { break; } } tok = t; } break; case RETC: ppos = pst.top(); pst.pop(); for (t=tokens.begin(); t != tokens.end(); t++) { if (t->get_pos() == ppos) { break; } } tok = t; break; case ENDC: exit(0); break; case PCHR: tmp = st.top(); st.pop(); cout << (char)tmp; break; case PNUM: tmp = st.top(); st.pop(); cout << tmp; break; case RCHR: tmp = (int)getchar(); heap[ st.top() ] = tmp; st.pop(); break; case RNUM: cin >> tmp; heap[ st.top() ] = tmp; st.pop(); break; } /* parse err. some exception here */ } }