00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _AUTOMATON_H_
00014 #define _AUTOMATON_H_
00015
00016 #include "typedefs.h"
00017 #include "succ_node.h"
00018 #include "belong.h"
00019 #include "tree_node.h"
00020
00021 class Automaton {
00022 private:
00023 map<string, TreeNode> ParseTree;
00024
00025 public:
00026
00027
00028 Automaton () {}
00029
00030
00031 Automaton (map<string, vector<insn> > rules) {
00032 TreeIter find, end;
00033 RuleIter rule;
00034 InsnVecIter vec;
00035 TreeNode *tnode;
00036
00037
00038 for (rule = rules.begin(); rule != rules.end(); rule++) {
00039
00040
00041 if (rule->first == "") continue;
00042
00043
00044
00045
00046
00047
00048
00049
00050 for (vec = (rule->second).begin() + 1; vec != (rule->second).end(); vec++) {
00051
00052
00053 find = ParseTree.find(vec->GetName());
00054 end = ParseTree.end();
00055 if (find == end) {
00056
00057
00058 tnode = new TreeNode(rule, vec);
00059 ParseTree.insert(pair<string, TreeNode>(vec->GetName(), *tnode));
00060 } else {
00061
00062 (find->second).InsertBelong(rule, vec);
00063 }
00064 }
00065 }
00066 SetSuccessorParents();
00067 }
00068
00069
00070 void SetSuccessorParents () {
00071 TreeIter titer, find, end = ParseTree.end();
00072 BelongIter biter;
00073 SuccNode *succ;
00074
00075 for (titer = ParseTree.begin(); titer != ParseTree.end(); titer++) {
00076 for (biter = (titer->second).GetBelongTo().begin(); biter != (titer->second).GetBelongTo().end(); biter++) {
00077 if (!(succ = (biter->second).GetSuccessor()))
00078 continue;
00079 find = ParseTree.find(succ->GetOp().GetName());
00080 if (find == end)
00081 cerr << ">> SetSuccessorParents: cannot find successor op in ParseTree." << endl;
00082 else {
00083 succ->SetParentNode(&(find->second));
00084 }
00085 }
00086 }
00087 }
00088
00089
00090 TreeNode *FindStartOp (string opname) {
00091 TreeIter find;
00092 BelongIter biter;
00093
00094 find = ParseTree.find(opname);
00095 if (find != ParseTree.end()) {
00096 for (biter = (find->second).GetBelongTo().begin(); biter != (find->second).GetBelongTo().end(); biter++) {
00097 if ((biter->second).IsStartOp())
00098 return &(find->second);
00099 continue;
00100 }
00101 } else
00102 return NULL;
00103 }
00104
00105 void PrintAutomaton () {
00106 TreeIter titer;
00107 BelongIter biter;
00108 SuccNode *succ;
00109
00110 cout << "Printing automaton ... " << endl;
00111 for (titer = ParseTree.begin(); titer != ParseTree.end(); titer++) {
00112 for (biter = (titer->second).GetBelongTo().begin(); biter != (titer->second).GetBelongTo().end(); biter++) {
00113 cout << biter->first << "\t" << (titer->second).GetOp().GetName() << "\t" << (biter->second).IsStartOp();
00114 if ((biter->second).IsStartOp() == true)
00115 cout << "\t" << (biter->second).GetMacroInsn().GetName();
00116 succ = (biter->second).GetSuccessor();
00117 if (succ != NULL)
00118 cout << "\t" << succ->GetOp().GetName() << "(" << succ->GetParentNode()->GetOp().GetName() << ")\t" << succ->IsLeafNode();
00119 cout << endl;
00120 }
00121 }
00122 cout << "done." << endl;
00123 }
00124 };
00125
00126 #endif // _AUTOMATON_H_