Guest User

Untitled

a guest
Dec 18th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. #include <iterator>
  2. #include <vector>
  3. #include <iostream>
  4. #include <set>
  5. #include <cassert>
  6.  
  7. using Transition = std::pair<char, std::string>;
  8.  
  9. class GrammarHolder {
  10. private:
  11. std::vector<char> non_terminals;
  12. std::vector<char> terminals;
  13. std::vector<Transition> transitions;
  14. char S;
  15. public:
  16. GrammarHolder(std::vector<char> non_terminals,
  17. std::vector<char> terminals,
  18. std::vector<Transition> transitions,
  19. char S) : non_terminals(non_terminals), terminals(terminals), transitions(transitions), S(S) {}
  20.  
  21. const std::vector<Transition>& getRules() const {
  22. return transitions;
  23. }
  24. };
  25.  
  26. class DPParser {
  27. public:
  28. DPParser(const GrammarHolder &g) : g(g) {}
  29.  
  30. bool Verify(const std::string &s) {
  31. w = s;
  32.  
  33. dynamic_holder.clear();
  34. dynamic_holder.resize(w.size() + 1);
  35.  
  36. dynamic_holder[0].insert(Case(g.getRules()[0], 0, 0));
  37. size_t current_size;
  38.  
  39. do {
  40. current_size = dynamic_holder[0].size();
  41. Forecast(0);
  42. Finish(0);
  43. } while (dynamic_holder[0].size() != current_size);
  44.  
  45. for (size_t i = 1; i <= w.size(); ++i) {
  46. Peek(i - 1, w[i - 1]);
  47. do {
  48. current_size = dynamic_holder[i].size();
  49. Forecast(i);
  50. Finish(i);
  51. } while (dynamic_holder[i].size() != current_size);
  52. }
  53.  
  54. return dynamic_holder[w.size()].find(Case(g.getRules()[0], 1, 0)) != dynamic_holder[w.size()].end();
  55. }
  56. private:
  57. struct Case {
  58. Transition trans;
  59. size_t point;
  60. size_t i;
  61.  
  62. Case(Transition rule, size_t point, size_t i) : trans(rule), point(point), i(i) {};
  63.  
  64. bool operator<(const Case& another) const {
  65. if (trans == another.trans) {
  66. if (point == another.point) {
  67. return i < another.i;
  68. }
  69. return point < another.point;
  70. }
  71. return trans < another.trans;
  72. }
  73. };
  74.  
  75. std::string w;
  76. std::vector<std::set<Case>> dynamic_holder;
  77. GrammarHolder g;
  78.  
  79. void Forecast(size_t j) {
  80. std::vector<Case> new_situations;
  81. for (std::set<Case>::iterator case_it = dynamic_holder.at(j).begin();
  82. case_it != dynamic_holder.at(j).end();
  83. ++case_it
  84. ) {
  85. std::vector<Transition> new_rules = g.getRules();
  86. for (std::vector<Transition>::const_iterator rule = new_rules.begin();
  87. rule != new_rules.end();
  88. ++rule) {
  89. if (rule->first == case_it->trans.second[case_it->point]) {
  90. new_situations.push_back(Case(*rule, 0, j));
  91. }
  92. }
  93. }
  94.  
  95. for (std::vector<Case>::const_iterator situation = new_situations.begin();
  96. situation != new_situations.end();
  97. situation++) {
  98. dynamic_holder[j].insert(*situation);
  99. }
  100. }
  101.  
  102. void Peek(size_t j, char x) {
  103. for (std::set<Case>::iterator situation = dynamic_holder[j].begin();
  104. situation != dynamic_holder[j].end();
  105. ++situation) {
  106. if (situation->trans.second[situation->point] == x) {
  107. dynamic_holder[j + 1].insert(Case(situation->trans, situation->point + 1, situation->i));
  108. }
  109. }
  110. }
  111.  
  112. void Finish(size_t j) {
  113. std::vector<Case> new_situations;
  114. for (std::set<Case>::iterator situation_a = dynamic_holder[j].begin();
  115. situation_a != dynamic_holder[j].end();
  116. ++situation_a) {
  117. if (situation_a->point != situation_a->trans.second.size()) continue;
  118. for (std::set<Case>::iterator situation_b = dynamic_holder[situation_a->i].begin();
  119. situation_b != dynamic_holder[situation_a->i].end();
  120. situation_b++){
  121. if (situation_b->trans.second[situation_b->point] == situation_a->trans.first) {
  122. new_situations.push_back(Case(situation_b->trans, situation_b->point + 1, situation_b->i));
  123. }
  124. }
  125. }
  126.  
  127. for (std::vector<Case>::iterator situation = new_situations.begin();
  128. situation != new_situations.end();
  129. situation++) {
  130. dynamic_holder[j].insert(*situation);
  131. }
  132. }
  133. };
  134.  
  135.  
  136. int main() {
  137. std::vector<char> N = {'U', 'S', 'C', 'D'};
  138. std::vector<char> sigma = {'a', 'b', 'c'};
  139. std::vector<Transition> P = {
  140. {'U', "S"},
  141. {'S', "C"},
  142. {'D', "aDb"},
  143. {'S', "SC"},
  144. {'C', "cD"},
  145. {'D', ""},
  146. };
  147. char S = 'U';
  148.  
  149. GrammarHolder grammar = GrammarHolder(N, sigma, P, S);
  150.  
  151.  
  152. DPParser dp_pars(grammar);
  153.  
  154.  
  155. std::string good_sample = "caaabbbcabcabcc";
  156. assert(dp_pars.Verify(good_sample));
  157. std::cout << "good sample successfully verified\n";
  158.  
  159. std::string bad_sample = "aaabbbcabcabcc";
  160. assert(dp_pars.Verify(good_sample));
  161. std::cout << "bad sample successfully verified\n";
  162. return 0;
  163. }
Add Comment
Please, Sign In to add comment