Advertisement
golim22

Untitled

Nov 24th, 2017
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <unordered_set>
  6.  
  7. using namespace std;
  8.  
  9. unordered_set<string> keywords = {
  10. "procedure",
  11. "Real",
  12. "var",
  13. "String",
  14. "begin",
  15. "if",
  16. "then",
  17. "else",
  18. "Delete",
  19. "End",
  20. };
  21.  
  22. unordered_set<string> delims = {
  23. ",",
  24. "+",
  25. ":",
  26. ")",
  27. "(",
  28. ";",
  29. "[",
  30. "]",
  31. "<",
  32. ">",
  33. "'",
  34.  
  35. };
  36.  
  37. enum type
  38. {
  39. keyword,
  40. delim,
  41. delim2,
  42. ident,
  43. number,
  44. str,
  45. error,
  46. };
  47.  
  48. struct Lexem {
  49. Lexem(const string &value, type type)
  50. : value(value)
  51. , type(type)
  52. {}
  53. string value;
  54. type type;
  55. };
  56.  
  57. int main()
  58. {
  59. vector<Lexem> lexems;
  60. fstream f("C:\\Users\\Rihards\\Desktop\\compiler\\comp.txt", ios::in);
  61. // ios::in File open for reading
  62.  
  63. string temp;
  64.  
  65. //if (kappa[i]=='\0');
  66. int linecount = 1;
  67. while (!f.eof())
  68. {
  69.  
  70. while (isspace(f.peek()))
  71. {
  72. if (f.peek() == '\n')
  73. linecount++;
  74. f.get();
  75. }
  76.  
  77. if (isalpha(f.peek()))
  78. {
  79. do {
  80. temp += f.get();
  81. } while (isalpha(f.peek()));
  82. type t = ident;
  83. if (keywords.find(temp) != keywords.end()) {
  84. t = keyword;
  85. }
  86. lexems.push_back(Lexem(temp, t));
  87. }
  88. else if (isdigit(f.peek()))
  89. {
  90. do {
  91. temp += f.get();
  92. } while (isdigit(f.peek()));
  93. lexems.push_back(Lexem(temp, number));
  94. }
  95.  
  96. else //массив делимторов
  97. {
  98. if (f.peek() == ':')
  99. {
  100. type t = delim;
  101. temp += f.get();
  102. if (f.peek() == '=') {
  103. temp += f.get();
  104. t = delim2;
  105. }
  106. lexems.push_back(Lexem(temp, t));
  107. }
  108. else if (f.peek() == '<')
  109. {
  110. type t = delim;
  111. temp += f.get();
  112. if (f.peek() == '>') {
  113. temp += f.get();
  114. t = delim2;
  115. }
  116. lexems.push_back(Lexem(temp, t));
  117. }
  118. else if (f.peek() == '\'')
  119. {
  120. lexems.push_back(Lexem("'", delim));
  121. f.get();
  122. while (f.peek() != '\'')
  123. {
  124. temp += f.get();
  125. }
  126. lexems.push_back(Lexem(temp, str));
  127.  
  128. lexems.push_back(Lexem("'", delim));
  129. f.get();
  130. }
  131. else
  132. {
  133. type t = error;
  134.  
  135. temp += f.get();
  136. if (delims.find(temp) != delims.end()) {
  137. t = delim;
  138. }
  139. lexems.push_back(Lexem(temp, t));
  140. }
  141.  
  142. }
  143.  
  144. temp.clear();
  145. }
  146.  
  147.  
  148.  
  149. for (int i = 0; i < lexems.size(); i++) {
  150. cout << lexems[i].type << '\t' << lexems[i].value << endl;
  151. }
  152. cout << "0=keywords, 1=delimiters, 2=double delimiters, 3=identificator, 4=constants, 5=strings, 6=errors"<<endl;
  153. f.close(); //закрывать файловую переменную. файл нам еще пригодится!
  154.  
  155.  
  156.  
  157.  
  158. system("PAUSE");
  159. return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement