Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.20 KB | None | 0 0
  1. #include <iostream> // std::cout
  2. #include <stack> // std::stack
  3. #include <vector> // std::vector
  4. #include <string>
  5. #include <utility>
  6. #include <map>
  7. #include <sstream>
  8.  
  9. using namespace std;
  10. using std::vector;
  11.  
  12. vector <string> parse_input(vector<string> non_terminals);
  13. string get_next_token (int index);
  14. void push_tokens ();
  15. bool is_non_terminal(string stack_data,vector<string> non_terminals);
  16. vector<string> tokens;
  17. vector<string> non_terminals;
  18. std::map<string, std::map<string, vector<string> > > parser_table;
  19. void build_table ();
  20. void print_production(string stack_data,vector<string> production);
  21. void generate_error(string error_message);
  22. vector<string> get_production(string non_terminal, string cur_token);
  23.  
  24. int main(){
  25.  
  26. build_table();
  27. push_tokens();
  28. non_terminals.push_back("S");
  29. non_terminals.push_back("R");
  30. non_terminals.push_back("U");
  31. non_terminals.push_back("V");
  32. non_terminals.push_back("T");
  33. parse_input(non_terminals);
  34.  
  35. }
  36.  
  37. vector<string> parse_input(vector<string> non_terminals){
  38.  
  39. stack<string> my_stack ;
  40. //push $ followed by start symbol.
  41. vector<string> output;
  42. my_stack.push("$");
  43. my_stack.push(non_terminals[0]);
  44.  
  45. int token_index = 0;
  46. string cur_token = get_next_token(token_index++);
  47.  
  48. while( my_stack.size() ){
  49.  
  50. string stack_data = my_stack.top();
  51. my_stack.pop();
  52.  
  53. if( is_non_terminal(stack_data,non_terminals) ){
  54. vector<string> production = get_production(stack_data,cur_token);
  55. if(production.size() == 1 && (production[0].compare("error") == 0)){
  56. //generate error for excess symbol in input.
  57. generate_error("excess " + cur_token);cur_token = get_next_token(token_index++);
  58. output.push_back("excess " + cur_token);
  59. my_stack.push(stack_data);
  60. }else if(production.size() == 1 && (production[0].compare("synch") == 0)){
  61. //synchronization error
  62. generate_error("synchronization error");
  63. output.push_back("synchronization error");
  64. }else{
  65. // in this case a production is get from table and want to push into stack.
  66. print_production(stack_data,production);
  67. std::stringstream ss;ss<<stack_data;ss<< "-->";for(int i =0 ;i < production.size(); i++){ss<<production[i];}
  68. output.push_back(ss.str());
  69. if( !( production[0].compare("epsilon") ) == 0 ){
  70. for(int i =production.size() - 1 ;i >=0; i--){
  71. my_stack.push(production[i]);
  72. }
  73. }
  74. }
  75. }else{
  76. if(stack_data.compare(cur_token) == 0){
  77. //token matched get next token to match.
  78. cout<<"match "<< stack_data <<endl;
  79. std::stringstream ss;ss << "match ";ss << stack_data;
  80. output.push_back(ss.str());
  81. if(cur_token.compare("$")==0){
  82. cout<<"input finished successfully"<<endl;
  83. output.push_back("input finished successfully");
  84. }else{
  85. cur_token = get_next_token(token_index++);
  86. }
  87. }else{
  88. //two unmatched terminals move to next pop from the stack to get next match.
  89. if(cur_token.compare("$") == 0){
  90.  
  91. std::stringstream ss;ss << "missing token";ss << " ' ";ss << stack_data;ss << "'";
  92. generate_error(ss.str());
  93. output.push_back(ss.str());
  94.  
  95. }else{
  96. generate_error("unmatching terminals");
  97. output.push_back("unmatching terminals");
  98.  
  99. }
  100.  
  101. }
  102. }
  103.  
  104. }
  105. return output;
  106. }
  107.  
  108. void print_production(string stack_data, vector<string> production){
  109. cout<<stack_data<< "-->";
  110. for(int i =0 ;i < production.size(); i++){
  111. cout<<production[i];
  112. }
  113. cout<<"\n";
  114. }
  115.  
  116. void generate_error(string error_message){
  117. cout<<error_message<<endl;
  118. }
  119. bool is_non_terminal(string stack_data,vector<string> non_terminals){
  120.  
  121. bool exist = false;
  122.  
  123. for(int i=0 ;i< non_terminals.size();i++){
  124. if(stack_data.compare(non_terminals[i]) == 0) exist = true;
  125. }
  126. return exist;
  127. }
  128. string get_next_token (int index){
  129. return tokens[index];
  130. }
  131.  
  132. void push_tokens (){
  133.  
  134. tokens.push_back("s");
  135. tokens.push_back("s");
  136. tokens.push_back("u");
  137. tokens.push_back("u");
  138. tokens.push_back("b");
  139. tokens.push_back("b");
  140. tokens.push_back("t");
  141. tokens.push_back("v");
  142. tokens.push_back("t");
  143. tokens.push_back("$");
  144. }
  145.  
  146. vector<string> get_production(string non_terminal, string cur_token){
  147.  
  148. std::map<string, vector<string> > non_terminal_map;
  149. non_terminal_map = parser_table[non_terminal] ;
  150. return non_terminal_map[cur_token];
  151. }
  152. void build_table (){
  153.  
  154. std::vector<string> error;
  155. error.push_back("error");
  156.  
  157. std::vector<string> synch;
  158. synch.push_back("synch");
  159.  
  160. // std::vector<string> id;
  161. // id.push_back("id");
  162.  
  163. std::vector<string> epsilon;
  164. epsilon.push_back("epsilon");
  165.  
  166.  
  167. std::vector<string> RT;
  168. RT.push_back("R");
  169. RT.push_back("T");
  170.  
  171. std::vector<string> sURb;
  172. sURb.push_back("s");
  173. sURb.push_back("U");
  174. sURb.push_back("R");
  175. sURb.push_back("b");
  176.  
  177. std::vector<string> uU;
  178. uU.push_back("u");
  179. uU.push_back("U");
  180.  
  181.  
  182. std::vector<string> vV;
  183. vV.push_back("v");
  184. vV.push_back("V");
  185.  
  186. std::vector<string> VtT;
  187. VtT.push_back("V");
  188. VtT.push_back("t");
  189. VtT.push_back("T");
  190.  
  191. // std::vector<string> parenthesesE;
  192. // parenthesesE.push_back("(");
  193. // parenthesesE.push_back("E");
  194. // parenthesesE.push_back(")");
  195.  
  196.  
  197.  
  198. std::map<string, vector<string> > map1;
  199. map1["s"] = RT;
  200. map1["u"] = error;
  201. map1["v"] = RT;
  202. map1["b"] = error;
  203. map1["t"] = RT;
  204. map1["$"] = epsilon;
  205.  
  206.  
  207.  
  208.  
  209. std::map<string, vector<string> > map2;
  210.  
  211. map2["s"] = sURb;
  212. map2["u"] = error;
  213. map2["v"] = epsilon;
  214. map2["b"] = epsilon;
  215. map2["t"] = epsilon;
  216. map2["$"] = epsilon;
  217.  
  218.  
  219. std::map<string, vector<string> > map3;
  220.  
  221.  
  222. map3["s"] = epsilon;
  223. map3["u"] = uU;
  224. map3["v"] = error;
  225. map3["b"] = epsilon;
  226. map3["t"] = error;
  227. map3["$"] = error;
  228.  
  229. std::map<string, std::vector<string>> map4;
  230.  
  231. map4["s"] = error;
  232. map4["u"] = error;
  233. map4["v"] = vV;
  234. map4["b"] = error;
  235. map4["t"] = epsilon;
  236. map4["$"] = error;
  237.  
  238. std::map<string, vector<string> > map5;
  239.  
  240. map5["s"] = error;
  241. map5["u"] = error;
  242. map5["v"] = VtT;
  243. map5["b"] = error;
  244. map5["t"] = VtT;
  245. map5["$"] = epsilon;
  246.  
  247. parser_table["S"] = map1;
  248. parser_table["R"] = map2;
  249. parser_table["U"] = map3;
  250. parser_table["V"] = map4;
  251. parser_table["T"] = map5;
  252.  
  253.  
  254.  
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement