semantico.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. #include "semantico.hh"
  2. void Semantico::check(std::string str){
  3. std::string line;
  4. std::ifstream fileInteiro("tabeladeSimbolosInteiro");
  5. while(getline(fileInteiro, line)){
  6. line.erase(remove_if(line.begin(), line.end(), isspace), line.end());
  7. if(!count(inteiro.begin(), inteiro.end(), line)){
  8. inteiro.push_back(line);
  9. }
  10. }
  11. std::ifstream fileFlutuante("tabeladeSimbolosFlutuante");
  12. while(getline(fileFlutuante, line)){
  13. line.erase(remove_if(line.begin(), line.end(), isspace), line.end());
  14. if(!count(flutuante.begin(), flutuante.end(), line)){
  15. flutuante.push_back(line);
  16. }
  17. }
  18. std::ifstream fileBanana("tabeladeSimbolosBanana");
  19. while(getline(fileBanana, line)){
  20. line.erase(remove_if(line.begin(), line.end(), isspace), line.end());
  21. if(!count(banana.begin(), banana.end(), line)){
  22. banana.push_back(line);
  23. }
  24. }
  25. if (std::regex_search(str, m, std::regex("^para\\s+\\(inteiro\\s+[A-Za-z]+\\s+=\\s+[0-9]+;\\s+[A-Za-z]+\\s+<\\s+[0-9]+;\\s+[A-Za-z]+\\+\\+\\)\\s+\\{[^}]*\\}$"))){
  26. gerador = new Para(str);
  27. std::string tmp0 = str;
  28. while(std::regex_search(str, m, std::regex("inteiro\\s+[A-Za-z]+\\s+=\\s+[0-9]+;"))){
  29. tmp0 = tmp0 + m.str(0) + "\n";
  30. str = m.suffix().str();
  31. }
  32. tmp0.erase(0, 14);
  33. for(int i = 0; i < tmp0.length(); i++){
  34. if(tmp0[i] == '='){
  35. tmp0.erase(i, tmp0.length());
  36. break;
  37. }
  38. }
  39. tmp0.erase(remove_if(tmp0.begin(), tmp0.end(), isspace), tmp0.end());
  40. std::string tmp1;
  41. while(std::regex_search(str, m, std::regex("[A-Za-z]+\\s+<\\s+[0-9]+;"))){
  42. tmp1 = tmp1 + m.str(0) + "\n";
  43. str = m.suffix().str();
  44. }
  45. for(int i = 0; i < tmp1.length(); i++){
  46. if(tmp1[i] == '<'){
  47. tmp1.erase(i, tmp1.length());
  48. break;
  49. }
  50. }
  51. tmp1.erase(remove_if(tmp1.begin(), tmp1.end(), isspace), tmp1.end());
  52. std::string tmp2;
  53. while(std::regex_search(str, m, std::regex("[A-Za-z]+\\+\\+"))){
  54. tmp2 = tmp2 + m.str(0) + "\n";
  55. str = m.suffix().str();
  56. }
  57. for(int i = 0; i < tmp2.length(); i++){
  58. if(tmp2[i] == '+'){
  59. tmp2.erase(i, tmp2.length());
  60. break;
  61. }
  62. }
  63. tmp2.erase(remove_if(tmp2.begin(), tmp2.end(), isspace), tmp2.end());
  64. if(tmp0 == tmp1){
  65. if(tmp1 == tmp2){
  66. this->str = this->str + gerador->getCode() + "\n";
  67. } else {
  68. b.push_back(false);
  69. std::cout << "Erro de semântica" << std::endl << "Erro no para" << std::endl;
  70. }
  71. } else {
  72. b.push_back(false);
  73. std::cout << "Erro de semântica" << std::endl << "Erro no para" << std::endl;
  74. }
  75. } else if (std::regex_search(str, m, std::regex ("inteiro\\s+[A-Za-z]+\\s+=\\s+[0-9]+\\;|inteiro\\s+[A-Za-z]+\\;"))){
  76. gerador = new Inteiro(str);
  77. str.erase(0, 7);
  78. for(int i = 0; i < str.length(); i++){
  79. if(str[i] == ';' || str[i] == '='){
  80. str.erase(i, str.length());
  81. }
  82. }
  83. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  84. if(count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str) || count(banana.begin(), banana.end(), str)){
  85. std::cout << "Erro de semântica" << std::endl << "Variável já foi declarada" << std::endl;
  86. b.push_back(false);
  87. } else {
  88. inteiro.push_back(str);
  89. this->str = this->str + gerador->getCode() + "\n";
  90. }
  91. } else if (std::regex_search(str, m, std::regex("flutuante\\s+[A-Za-z]\\s+=\\s+[0-9]*\\.[0-9]+;|flutuante\\s+[A-Za-z];|flutuante\\s+[A-Za-z]\\s+=\\s+[0-9]+;"))){
  92. gerador = new Flutuante(str);
  93. str.erase(0, 9);
  94. for(int i = 0; i < str.length(); i++){
  95. if(str[i] == ';' || str[i] == '='){
  96. str.erase(i, str.length());
  97. }
  98. }
  99. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  100. if(count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str) || count(banana.begin(), banana.end(), str)){
  101. std::cout << "Erro de semântica" << std::endl << "Variável já foi declarada" << std::endl;
  102. b.push_back(false);
  103. } else {
  104. flutuante.push_back(str);
  105. this->str = this->str + gerador->getCode() + "\n";
  106. }
  107. } else if (std::regex_search(str, m, std::regex("banana\\s+[A-Za-z]+;|banana\\s+[A-Za-z]+\\s+=\\s+\"[^\"]*\";"))){
  108. gerador = new Banana(str);
  109. str.erase(0, 6);
  110. for(int i = 0; i < str.length(); i++){
  111. if(str[i] == ';' || str[i] == '='){
  112. str.erase(i, str.length());
  113. }
  114. }
  115. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  116. if(count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str) || count(banana.begin(), banana.end(), str)){
  117. std::cout << "Erro de semântica" << std::endl << "Variável já foi declarada" << std::endl;
  118. b.push_back(false);
  119. } else {
  120. banana.push_back(str);
  121. this->str = this->str + gerador->getCode() + "\n";
  122. }
  123. } else if (std::regex_search(str, m, std::regex("se\\s+\\([^)]*\\)\\s+\\{[^}]*\\}\\s+senao\\s+\\{[^}]*\\}"))){
  124. gerador = new Sesenao(str);
  125. for(int i = 0; i < str.length(); i++){
  126. if(str[i] == '('){
  127. str.erase(0, i+1);
  128. } else if (str[i] == ')'){
  129. str.erase(i);
  130. }
  131. }
  132. for(int i = 0; i < str.length(); i++){
  133. if(str[i] == '=' || str[i] == '!' || str[i] == '>' || str[i] == '<'){
  134. str.erase(i, str.length());
  135. }
  136. }
  137. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  138. if(count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str) || count(banana.begin(), banana.end(), str)){
  139. this->str = this->str + gerador->getCode() + "\n";
  140. } else {
  141. std::cout << "Erro de semântica" << std::endl << "A variável de se não foi declarada" << std::endl;
  142. b.push_back(false);
  143. }
  144. } else if (std::regex_search(str, m, std::regex("se\\s+\\([^)]*\\)\\s+\\{[^}]*\\}"))){
  145. gerador = new Sesenao(str);
  146. for(int i = 0; i < str.length(); i++){
  147. if(str[i] == '('){
  148. str.erase(0, i+1);
  149. } else if (str[i] == ')'){
  150. str.erase(i);
  151. }
  152. }
  153. for(int i = 0; i < str.length(); i++){
  154. if(str[i] == '=' || str[i] == '!' || str[i] == '>' || str[i] == '<'){
  155. str.erase(i, str.length());
  156. }
  157. }
  158. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  159. if(count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str) || count(banana.begin(), banana.end(), str)){
  160. this->str = this->str + gerador->getCode() + "\n";
  161. } else {
  162. std::cout << "Erro de semântica" << std::endl << "A variável de se não foi declarada" << std::endl;
  163. b.push_back(false);
  164. }
  165. } else if (std::regex_search(str, m, std::regex("enquanto\\s+\\([^)]*\\)\\s+\\{[^}]*\\}"))){
  166. gerador = new Enquanto(str);
  167. int start, end;
  168. for(int i = 0; i < str.length(); i++){
  169. if(str[i] == '('){
  170. start = i + 1;
  171. //str.erase(0, i + 1);
  172. } else if(str[i] == ')'){
  173. end = i;
  174. //str.erase(i, str.length());
  175. break;
  176. }
  177. }
  178. str.erase(end, str.length());
  179. str.erase(0, start);
  180. for(int i = 0; i < str.length(); i++){
  181. if(str[i] == '=' || str[i] == '!' || str[i] == '>' || str[i] == '<'){
  182. str.erase(i, str.length());
  183. }
  184. }
  185. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  186. if(count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str) || count(banana.begin(), banana.end(), str)){
  187. this->str = this->str + gerador->getCode() + "\n";
  188. } else {
  189. std::cout << "Erro de semântica" << std::endl << "Variável de enquanto não foi declarada" << str << std::endl;
  190. b.push_back(false);
  191. }
  192. } else if (std::regex_search(str, m, std::regex("digitar\\s+\\([A-Za-z0-9]+\\)\\;"))){
  193. gerador = new Digitar(str);
  194. int start, end;
  195. for(int i = 0; i < str.length(); i++){
  196. if(str[i] == '('){
  197. start = i+1;
  198. }
  199. if (str[i] == ')'){
  200. end = i;
  201. }
  202. }
  203. str.erase(end, str.length());
  204. str.erase(0, start);
  205. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  206. if(count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str) || count(banana.begin(), banana.end(), str)){
  207. this->str = this->str + gerador->getCode() + "\n";
  208. } else {
  209. std::cout << "Erro de semântica" << std::endl << "Variável de digitar não foi declarada" << std::endl;
  210. b.push_back(false);
  211. }
  212. } else if (std::regex_search(str, m, std::regex("imprimir\\s+\\([^)]*\\)\\;"))){
  213. gerador = new Imprimir(str);
  214. if(std::regex_search(str, m, std::regex("imprimir\\s+\\(\"[^\"]*\"\\)"))){
  215. this->str = this->str + gerador->getCode() + "\n";
  216. } else {
  217. int start, end;
  218. for(int i = 0; i < str.length(); i++){
  219. if(str[i] == '('){
  220. start = i+1;
  221. }
  222. if (str[i] == ')'){
  223. end = i;
  224. }
  225. }
  226. str.erase(end, str.length());
  227. str.erase(0, start);
  228. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  229. if(count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str) || count(banana.begin(), banana.end(), str)){
  230. this->str = this->str + gerador->getCode() + "\n";
  231. } else {
  232. std::cout << "Erro de semântica" << std::endl << "Variável de imprimir não foi declarada" << std::endl;
  233. b.push_back(false);
  234. }
  235. }
  236. } else if (std::regex_search(str, m, std::regex("[A-Za-z]+\\s+=\\s+[0-9]+;"))){
  237. gerador = new Inicializacao(str);
  238. for(int i = 0; i < str.length(); i++){
  239. if(str[i] == '='){
  240. str.erase(i, str.length());
  241. }
  242. }
  243. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  244. if(count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str)){
  245. this->str = this->str + gerador->getCode() + "\n";
  246. } else if (count(banana.begin(), banana.end(), str)){
  247. std::cout << "Erro de semântica" << std::endl << "A variável é uma banana, deve receber string" << std::endl;
  248. b.push_back(false);
  249. } else {
  250. std::cout << "Erro de semântica" << std::endl << "A variável não foi declarada" << std::endl;
  251. b.push_back(false);
  252. }
  253. } else if (std::regex_search(str, m, std::regex("[A-Za-z]+\\s+=\\s+[0-9]*\\.[0-9]+;"))){
  254. gerador = new Inicializacao(str);
  255. for(int i = 0; i < str.length(); i++){
  256. if(str[i] == '='){
  257. str.erase(i, str.length());
  258. }
  259. }
  260. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  261. if(count(flutuante.begin(), flutuante.end(), str)){
  262. this->str = this->str + gerador->getCode() + "\n";
  263. } else if (count(inteiro.begin(), inteiro.end(), str)){
  264. std::cout << "Erro de semântica" << std::endl << "A variável é um inteiro, não pode receber número decimal" << std::endl;
  265. b.push_back(false);
  266. } else if (count(banana.begin(), banana.end(), str)){
  267. std::cout << "Erro de semântica" << std::endl << "A variável é uma banana, deve receber string" << std::endl;
  268. b.push_back(false);
  269. } else {
  270. std::cout << "Erro de semântica" << std::endl << "A variável não foi declarada" << std::endl;
  271. b.push_back(false);
  272. }
  273. } else if (std::regex_search(str, m, std::regex("[A-Za-z]+\\s+=\\s+\"[^\"]*\""))){
  274. gerador = new Inicializacao(str);
  275. for(int i = 0; i < str.length(); i++){
  276. if(str[i] == '='){
  277. str.erase(i, str.length());
  278. }
  279. }
  280. str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
  281. if(count(banana.begin(), banana.end(), str)){
  282. this->str = this->str + gerador->getCode() + "\n";
  283. } else if (count(inteiro.begin(), inteiro.end(), str) || count(flutuante.begin(), flutuante.end(), str)){
  284. std::cout << "Erro de semântica" << std::endl << "A variável não aceita banana (string)" << std::endl;
  285. b.push_back(false);
  286. } else {
  287. std::cout << "Erro de semântica" << std::endl << "A variável não foi declarada" << std::endl;
  288. b.push_back(false);
  289. }
  290. } else if (str == ""){
  291. //
  292. } else {
  293. b.push_back(false);
  294. std::cout << "\nErro de semântica" << std::endl;
  295. }
  296. std::ofstream ofsInteiro ("tabeladeSimbolosInteiro", std::ofstream::out);
  297. for (int i = 0; i < inteiro.size(); i++){
  298. ofsInteiro << inteiro[i] << "\n";
  299. }
  300. std::ofstream ofsFlutuante ("tabeladeSimbolosFlutuante", std::ofstream::out);
  301. for (int i = 0; i < flutuante.size(); i++){
  302. ofsFlutuante << flutuante[i] << "\n";
  303. }
  304. std::ofstream ofsBanana ("tabeladeSimbolosBanana", std::ofstream::out);
  305. for (int i = 0; i < banana.size(); i++){
  306. ofsBanana << banana[i] << "\n";
  307. }
  308. }
  309. Semantico::Semantico(){
  310. std::ifstream file("input.txt");
  311. std::string line;
  312. while(getline(file, line)){
  313. check(line);
  314. }
  315. }
  316. Semantico::Semantico(std::string str){
  317. check(str);
  318. }
  319. std::string Semantico::getCode(){
  320. return this->str;
  321. }
  322. bool Semantico::getBool(){
  323. if(count(b.begin(), b.end(), false)){
  324. return false;
  325. } else {
  326. return true;
  327. }
  328. }