Guest User

Untitled

a guest
Jan 20th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. terminate called after throwing an instance of 'std::out_of_range'
  2. what(): basic_string::substr
  3.  
  4. bool is_well_formed(ifstream& ifs, string& error_msg) {
  5. // your code goes here
  6. string fname, line;
  7. Token tok;
  8. Lexer lexer;
  9. tags.insert("blue");
  10. tags.insert("red");
  11. tags.insert("cyan");
  12. tags.insert("white");
  13. tags.insert("yellow");
  14. tags.insert("magenta");
  15. tags.insert("dim");
  16. tags.insert("underline");
  17. tags.insert("bold");
  18. while (getline(cin, fname)) {
  19. // tries to open the file whose name is in string fname
  20. string name = fname.substr(1, fname.length() - 2);
  21. cout << "Name" + name;
  22. ifs.open(name.c_str());
  23. if (ifs.fail()) {
  24. cerr << "ERROR: Failed to open file " << fname << endl;
  25. ifs.clear();
  26. } else {
  27. while (getline(ifs, line)) {
  28. lexer.set_input(line);
  29. while (lexer.has_more_token()) {
  30. tok = lexer.next_token();
  31. string tmpTok = tok.value;
  32. switch (tok.type) {
  33. case TAG:
  34. // If it has /, remove / from tmpTok
  35. if (tok.value[0] == '/') {
  36. tmpTok = tmpTok.substr(1, tmpTok.length() - 1);
  37. }
  38. if (tags.find(tmpTok) == tags.end()) {
  39. // Check whether the encountered tag is valid
  40. error_return("Tag " + tmpTok + " is invalid!");
  41. } else {
  42. // Valid Tag encountered
  43. stack < string > tagstack;
  44. tagstack.push(tmpTok);
  45. // Check if the tags are formed properly
  46. if (tok.value[0] == '/') {
  47. // Remove / from tmpTok
  48. string closingTag = tmpTok;
  49. string openingTag = tagstack.top();
  50. tagstack.pop();
  51. if (closingTag.compare(openingTag) != 0) {
  52. error_return(
  53. closingTag + "doesn't match"
  54. + openingTag);
  55. } //else
  56. // return true; // if the file is well formed
  57. }
  58. }
  59. break;
  60. case IDENT:
  61. cout << "IDENT: " << tok.value << endl;
  62. break;
  63. case ERRTOK:
  64. error_return("Syntax error on this linen");
  65. //cout << "Syntax error on this linen";
  66. break;
  67. case ENDTOK:
  68. break;
  69. }
  70. }
  71. }
  72. }
  73. }
  74. return true; // if the file is well-formed
  75. }
  76.  
  77. void print_well_formed_file(ifstream& ifs) {
  78. //Check if file is well formed.
  79. string line;
  80. Lexer command;
  81. if (is_well_formed(ifs, line)) { //if well formed display
  82. command.set_input(line);
  83. display(command);
  84. }
  85.  
  86. }
  87. void display(Lexer cmd_lexer) {
  88. string file_name;
  89.  
  90. if (!parse_input(cmd_lexer, file_name)) {
  91. error_return("Syntax error: display <filename>");
  92. return;
  93. }
  94.  
  95. ifstream ifs(file_name.c_str());
  96. string error_msg;
  97. if (ifs) {
  98. if (!is_well_formed(ifs, error_msg)) {
  99. error_return(error_msg);
  100. } else {
  101. ifs.clear(); // clear EOF flag
  102. ifs.seekg(0, ios::beg); // go back to the very beginning
  103. print_well_formed_file(ifs);
  104. }
  105. } else {
  106. error_return("Can't open " + file_name + " for reading");
  107. }
  108. ifs.close();
  109. }
  110.  
  111. validate <file name>
  112. display <file name>
  113. exit
  114.  
  115. string name = fname.substr(1, fname.length() - 2);
Add Comment
Please, Sign In to add comment