PageRenderTime 42ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/src/application/javacc/_SemanticAnalyzer.java

https://bitbucket.org/raphael_leite_serapiao/compilador
Java | 859 lines | 603 code | 131 blank | 125 comment | 153 complexity | 1490ec4ab1bf6bb007849ac384860522 MD5 | raw file
  1. /**
  2. * @author Raphael Leite Serapiao
  3. */
  4. package application.javacc;
  5. import java.util.*;
  6. import java.util.stream.Collectors;
  7. import java.util.stream.Stream;
  8. class union {
  9. public Integer categoria;
  10. public Integer atr1;
  11. public Integer atr2;
  12. public union(Integer categoria, Integer atr1, Integer atr2) {
  13. this.categoria = categoria;
  14. this.atr1 = atr1;
  15. this.atr2 = atr2;
  16. }
  17. @Override
  18. public String toString() {
  19. return " {" +
  20. "categoria=" + categoria +
  21. ", atr1=" + atr1 +
  22. ", atr2='" + atr2 + '\'' +
  23. '}';
  24. }
  25. }
  26. public class _SemanticAnalyzer {
  27. public enum CONTEXTO {ENTRADA_DADOS, ATRIBUICAO, AS_CONSTANT, AS_VARIABLE, NENHUM}
  28. public enum SAIDA {WRITE_ALL_THIS, WRITE_THIS, NENHUM}
  29. private final String ERRO1 = "identificador já foi declarado anteriormente -> ";
  30. private final String ERRO2 = "identificador de variável não indexada -> ";
  31. private final String ERRO3 = "identificador de variável indexada exige um índice -> ";
  32. private final String ERRO4 = "identificador não foi declarado ou o identificador é " +
  33. "usado como identificador inicial do programa ou então ele é uma constante/tipo enumerado -> ";
  34. private final String ERRO5 = "tipo inválido para constante de tipo logic";
  35. private final String ERRO6 = "tipo inválido para constante de tipo enumerado";
  36. private final String ERRO7 = "o identificador não foi declarado ou o identificador é " +
  37. "usado como identificador inicial do programa ou então ele é um tipo enumerado -> ";
  38. private final String ERRO8 = "identificador de constante ou de variável não indexada -> ";
  39. private CONTEXTO contexto = CONTEXTO.NENHUM;
  40. private Integer vt = 0;
  41. private Integer vp = 0;
  42. private Integer vi = 0;
  43. private Integer tvi = 0;
  44. private Integer ponteiro = 1;
  45. private Boolean variavelIndexada = null;
  46. private Stack<Integer> pilhaDeDesvios = new Stack<>();
  47. private List<Instruction> areaDeInstrucoes = new ArrayList<>();
  48. private Map<String, union> tabelaDeSimbolos = new LinkedHashMap<>();
  49. private Map<String, union> tupla = new HashMap();
  50. private Integer tipo = null;
  51. private SAIDA saida = SAIDA.NENHUM;
  52. public List<String> erros = new ArrayList<>();
  53. private Map<String, List<String>> tabelaDeTiposEnumerados = new LinkedHashMap<>();
  54. private List<Integer> listaDeAtributos = new ArrayList<>();
  55. private Integer constIntArmazenadaAcao12 = null;
  56. private String idArmazenadoAcao10 = "";
  57. private String idArmazenadoAcao24 = "";
  58. public Boolean execute = false;
  59. /*
  60. * ação #1:
  61. * reconhecimento do identificador de programa
  62. */
  63. public void action1(String token) {
  64. if (!execute) return;
  65. tabelaDeSimbolos.put(token, new union(0, null, null));
  66. }
  67. /*
  68. * ação #2:
  69. * reconhecimento de fim de programa
  70. */
  71. public void action2() {
  72. if (!execute) return;
  73. areaDeInstrucoes.add(new Instruction(ponteiro, "STP", new Item(0)));
  74. }
  75. /*
  76. * ação #3:
  77. * reconhecimento de identificador de tipo enumerado
  78. */
  79. public void action3(String token) {
  80. if (!execute) return;
  81. if (tabelaDeSimbolos.containsKey(token) || tabelaDeTiposEnumerados.containsKey(token)) {
  82. erros.add(ERRO1 + token);
  83. return;
  84. }
  85. tabelaDeTiposEnumerados.put(token, new ArrayList<>());
  86. }
  87. /*
  88. * ação #4:
  89. * reconhecimento de identificador de constante de tipo enumerado
  90. */
  91. public void action4(String token) {
  92. if (!execute) return;
  93. if (identificadorJaDeclarado(token)) {
  94. erros.add(ERRO1 + token);
  95. return;
  96. }
  97. List<String> list = null;
  98. Iterator<Map.Entry<String, List<String>>> it = tabelaDeTiposEnumerados.entrySet().iterator();
  99. while (it.hasNext())
  100. list = it.next().getValue();
  101. if (list != null)
  102. list.add(token);
  103. }
  104. /*
  105. * ação #5:
  106. * reconhecimento das palavras reservadas as constant
  107. */
  108. public void action5() {
  109. if (!execute) return;
  110. contexto = CONTEXTO.AS_CONSTANT;
  111. vi = 0;
  112. tvi = 0;
  113. }
  114. /*
  115. * ação #6:
  116. * reconhecimento do término da declaração de constantes ou variáveis de um determinado tipo
  117. */
  118. public void action6() {
  119. if (!execute) return;
  120. List<String> keyList = new ArrayList<>(tabelaDeSimbolos.keySet());
  121. int last_index = keyList.size() - 1;
  122. for (int i = last_index; i > last_index - (vp + vi); --i)
  123. tabelaDeSimbolos.get(keyList.get(i)).categoria = tipo;
  124. vp += tvi;
  125. switch (tipo) {
  126. case 1:
  127. case 5:
  128. areaDeInstrucoes.add(new Instruction(ponteiro, "ALI", new Item(vp)));
  129. ponteiro++;
  130. break;
  131. case 2:
  132. case 6:
  133. areaDeInstrucoes.add(new Instruction(ponteiro, "ALR", new Item(vp)));
  134. ponteiro++;
  135. break;
  136. case 3:
  137. case 7:
  138. areaDeInstrucoes.add(new Instruction(ponteiro, "ALS", new Item(vp)));
  139. ponteiro++;
  140. break;
  141. case 4:
  142. areaDeInstrucoes.add(new Instruction(ponteiro, "ALB", new Item(vp)));
  143. ponteiro++;
  144. break;
  145. }
  146. if (tipo == 1 || tipo == 2 || tipo == 3 || tipo == 4) {
  147. vp = 0;
  148. vi = 0;
  149. tvi = 0;
  150. }
  151. }
  152. /*
  153. * ação #7:
  154. * reconhecimento de valor na declaração de constante
  155. */
  156. public void action7(Token token) {
  157. if (!execute) return;
  158. switch (tipo) {
  159. case 5:
  160. areaDeInstrucoes.add(new Instruction(ponteiro, "LDI", new Item(Integer.parseInt(token.image))));
  161. ponteiro++;
  162. break;
  163. case 6:
  164. areaDeInstrucoes.add(new Instruction(ponteiro, "LDR", new Item(Float.parseFloat(token.image))));
  165. ponteiro++;
  166. break;
  167. case 7:
  168. areaDeInstrucoes.add(new Instruction(ponteiro, "LDS", new Item(token.image)));
  169. ponteiro++;
  170. break;
  171. }
  172. areaDeInstrucoes.add(new Instruction(ponteiro, "STC", new Item(vp)));
  173. ponteiro++;
  174. vp = 0;
  175. }
  176. /*
  177. * ação #8:
  178. * reconhecimento das palavras reservadas as variable
  179. */
  180. public void action8() {
  181. if (!execute) return;
  182. contexto = CONTEXTO.AS_VARIABLE;
  183. }
  184. /*
  185. * ação #9:
  186. * reconhecimento de identificador de constante
  187. */
  188. public void action9(String token) {
  189. if (!execute) return;
  190. if (identificadorJaDeclarado(token)) {
  191. erros.add(ERRO1 + token);
  192. return;
  193. }
  194. vt++;
  195. vp++;
  196. tabelaDeSimbolos.put(token, new union(null, vt, null));
  197. }
  198. /*
  199. * ação #10:
  200. * reconhecimento de identificador de variável
  201. */
  202. public void action10(String token) {
  203. if (!execute) return;
  204. if (contexto == CONTEXTO.AS_VARIABLE) {
  205. if (identificadorJaDeclarado(token)) {
  206. erros.add(ERRO1 + token);
  207. return;
  208. }
  209. variavelIndexada = false;
  210. idArmazenadoAcao10 = token;
  211. } else if (contexto == CONTEXTO.ATRIBUICAO || contexto == CONTEXTO.ENTRADA_DADOS) {
  212. variavelIndexada = false;
  213. idArmazenadoAcao10 = token;
  214. }
  215. }
  216. /*
  217. * ação #11:
  218. * reconhecimento de identificador de variável e tamanho da variável indexada
  219. */
  220. public void action11() {
  221. if (!execute) return;
  222. if (contexto == CONTEXTO.AS_VARIABLE) {
  223. if (!variavelIndexada) {
  224. vt++;
  225. vp++;
  226. tabelaDeSimbolos.put(idArmazenadoAcao10, new union(null, vt, null));
  227. } else {
  228. vi++;
  229. tvi += constIntArmazenadaAcao12;
  230. tabelaDeSimbolos.put(idArmazenadoAcao10,
  231. new union(null, vt + 1, constIntArmazenadaAcao12));
  232. vt += constIntArmazenadaAcao12;
  233. }
  234. } else if (contexto == CONTEXTO.ATRIBUICAO) {
  235. if (tabelaDeSimbolos.containsKey(idArmazenadoAcao10) && isIdentificadorDeVariavel(idArmazenadoAcao10)) {
  236. Integer atr1 = tabelaDeSimbolos.get(idArmazenadoAcao10).atr1;
  237. Integer atr2 = tabelaDeSimbolos.get(idArmazenadoAcao10).atr2;
  238. if (atr2 == null) {
  239. if (!variavelIndexada) {
  240. listaDeAtributos.add(atr1);
  241. } else {
  242. erros.add(ERRO2 + idArmazenadoAcao10);
  243. return;
  244. }
  245. } else {
  246. if (variavelIndexada) {
  247. listaDeAtributos.add(atr1 + constIntArmazenadaAcao12 - 1);
  248. } else {
  249. erros.add(ERRO3 + idArmazenadoAcao10);
  250. return;
  251. }
  252. }
  253. } else {
  254. erros.add(ERRO4 + idArmazenadoAcao10);
  255. return;
  256. }
  257. } else if (contexto == CONTEXTO.ENTRADA_DADOS) {
  258. if (tabelaDeSimbolos.containsKey(idArmazenadoAcao10) && isIdentificadorDeVariavel(idArmazenadoAcao10)) {
  259. Integer atr1 = tabelaDeSimbolos.get(idArmazenadoAcao10).atr1;
  260. Integer atr2 = tabelaDeSimbolos.get(idArmazenadoAcao10).atr2;
  261. Integer cat = tabelaDeSimbolos.get(idArmazenadoAcao10).categoria;
  262. if (atr2 == null) {
  263. if (!variavelIndexada) {
  264. areaDeInstrucoes.add(new Instruction(ponteiro, "REA", new Item(cat)));
  265. ponteiro++;
  266. areaDeInstrucoes.add(new Instruction(ponteiro, "STR", new Item(atr1)));
  267. ponteiro++;
  268. } else {
  269. erros.add(ERRO2 + idArmazenadoAcao10);
  270. return;
  271. }
  272. } else {
  273. if (variavelIndexada) {
  274. areaDeInstrucoes.add(new Instruction(ponteiro, "REA", new Item(cat)));
  275. ponteiro++;
  276. areaDeInstrucoes.add(new Instruction(ponteiro, "STR",
  277. new Item(atr1 + constIntArmazenadaAcao12 - 1)));
  278. ponteiro++;
  279. } else {
  280. erros.add(ERRO3 + idArmazenadoAcao10);
  281. return;
  282. }
  283. }
  284. } else {
  285. erros.add(ERRO4 + idArmazenadoAcao10);
  286. return;
  287. }
  288. }
  289. }
  290. /*
  291. * ação #12:
  292. * reconhecimento de constante inteira como tamanho da variável indexada
  293. */
  294. public void action12(String token) {
  295. if (!execute) return;
  296. constIntArmazenadaAcao12 = Integer.valueOf(token);
  297. variavelIndexada = true;
  298. }
  299. /*
  300. * ação #13:
  301. * reconhecimento da palavra reservada integer
  302. */
  303. public void action13() {
  304. if (!execute) return;
  305. tipo = (contexto == CONTEXTO.AS_VARIABLE) ? 1 : 5;
  306. }
  307. /*
  308. * ação #14:
  309. * reconhecimento da palavra reservada float
  310. */
  311. public void action14() {
  312. if (!execute) return;
  313. tipo = (contexto == CONTEXTO.AS_VARIABLE) ? 2 : 6;
  314. }
  315. /*
  316. * ação #15:
  317. * reconhecimento da palavra reservada string
  318. */
  319. public void action15() {
  320. if (!execute) return;
  321. tipo = (contexto == CONTEXTO.AS_VARIABLE) ? 3 : 7;
  322. }
  323. /*
  324. * ação #16:
  325. * reconhecimento da palavra reservada boolean
  326. */
  327. public void action16() {
  328. if (!execute) return;
  329. if (contexto == CONTEXTO.AS_VARIABLE)
  330. tipo = 4;
  331. else
  332. erros.add(ERRO5);
  333. }
  334. /*
  335. * ação #17:
  336. * reconhecimento de identificador de tipo enumerado
  337. */
  338. public void action17() {
  339. if (!execute) return;
  340. if (contexto == CONTEXTO.AS_VARIABLE)
  341. tipo = 1;
  342. else
  343. erros.add(ERRO6);
  344. }
  345. /*
  346. * ação #18:
  347. * reconhecimento do início do comando de atribuição
  348. */
  349. public void action18() {
  350. if (!execute) return;
  351. contexto = contexto.ATRIBUICAO;
  352. }
  353. /*
  354. * ação #19:
  355. * reconhecimento do fim do comando de atribuição
  356. */
  357. public void action19() {
  358. if (!execute) return;
  359. listaDeAtributos.stream().forEach(i -> {
  360. areaDeInstrucoes.add(new Instruction(ponteiro, "STR", new Item(i)));
  361. ponteiro++;
  362. });
  363. listaDeAtributos.clear();
  364. }
  365. //ação #20: reconhecimento do comando de entrada de dados
  366. public void action20() {
  367. if (!execute) return;
  368. contexto = CONTEXTO.ENTRADA_DADOS;
  369. }
  370. //ação #21: reconhecimento das palavras reservadas “write all this”
  371. public void action21() {
  372. if (!execute) return;
  373. saida = SAIDA.WRITE_ALL_THIS;
  374. }
  375. //ação #22: reconhecimento das palavras reservadas “write this”
  376. public void action22() {
  377. if (!execute) return;
  378. saida = SAIDA.WRITE_THIS;
  379. }
  380. //ação #23: reconhecimento de mensagem em comando de saída de dados
  381. public void action23() {
  382. if (!execute) return;
  383. areaDeInstrucoes.add(new Instruction(ponteiro, "WRT", new Item(0)));
  384. ponteiro++;
  385. }
  386. //ação #24: reconhecimento de identificador em comando de saída ou em expressão
  387. public void action24(String token) {
  388. if (!execute) return;
  389. if (tabelaDeSimbolos.containsKey(token) && isIdentificadorDeConstanteOuVariavel(token)) {
  390. variavelIndexada = false;
  391. idArmazenadoAcao24 = token;
  392. } else {
  393. erros.add(ERRO7 + token);
  394. }
  395. }
  396. //ação #25: reconhecimento de identificador de constante ou de
  397. // variável e tamanho de variável indexada em comando de saída
  398. public void action25() {
  399. if (!execute) return;
  400. Integer atr1 = tabelaDeSimbolos.get(idArmazenadoAcao24).atr1;
  401. Integer atr2 = tabelaDeSimbolos.get(idArmazenadoAcao24).atr2;
  402. if (!variavelIndexada) {
  403. if (atr2 == null) {
  404. if (saida == SAIDA.WRITE_ALL_THIS) {
  405. areaDeInstrucoes.add(
  406. new Instruction(ponteiro, "LDS", new Item(idArmazenadoAcao24 + " = ")));
  407. ponteiro++;
  408. areaDeInstrucoes.add(new Instruction(ponteiro, "WRT", new Item(0)));
  409. ponteiro++;
  410. }
  411. areaDeInstrucoes.add(new Instruction(ponteiro, "LDV", new Item(atr1)));
  412. ponteiro++;
  413. } else {
  414. erros.add(ERRO3 + idArmazenadoAcao24);
  415. }
  416. } else {
  417. if (atr2 != null) {
  418. if (saida == SAIDA.WRITE_ALL_THIS) {
  419. areaDeInstrucoes.add(new Instruction(ponteiro, "LDS",
  420. new Item(idArmazenadoAcao24 + "[" + constIntArmazenadaAcao12 + "] = ")));
  421. ponteiro++;
  422. areaDeInstrucoes.add(new Instruction(ponteiro, "WRT", new Item(0)));
  423. ponteiro++;
  424. }
  425. areaDeInstrucoes.add(
  426. new Instruction(ponteiro, "LDV", new Item(atr1 + constIntArmazenadaAcao12 - 1)));
  427. ponteiro++;
  428. } else {
  429. erros.add(ERRO8 + idArmazenadoAcao24);
  430. }
  431. }
  432. }
  433. //ação #26: reconhecimento de constante inteira em comando de saída ou em expressão
  434. public void action26(String token) {
  435. if (!execute) return;
  436. areaDeInstrucoes.add(new Instruction(ponteiro, "LDI", new Item(Integer.parseInt(token))));
  437. ponteiro++;
  438. }
  439. //ação #27: reconhecimento de constante real em comando de saída ou em expressão
  440. public void action27(String token) {
  441. if (!execute) return;
  442. areaDeInstrucoes.add(new Instruction(ponteiro, "LDR", new Item(Float.parseFloat(token))));
  443. ponteiro++;
  444. }
  445. //ação #28: reconhecimento de constante literal em comando de saída ou em expressão
  446. public void action28(String token) {
  447. if (!execute) return;
  448. areaDeInstrucoes.add(new Instruction(ponteiro, "LDS", new Item(token)));
  449. ponteiro++;
  450. }
  451. //ação #29: reconhecimento de fim de comando de seleção
  452. public void action29() {
  453. if (!execute) return;
  454. Integer endereçoInstruçãoDesvioAcao30_31_32 = pilhaDeDesvios.pop();
  455. areaDeInstrucoes
  456. .stream()
  457. .filter(i -> i.getPointer() == endereçoInstruçãoDesvioAcao30_31_32)
  458. .findFirst()
  459. .ifPresent(i -> i.setParameter(new Item(ponteiro)));
  460. }
  461. //ação #30: reconhecimento da palavra reservada true
  462. public void action30() {
  463. if (!execute) return;
  464. areaDeInstrucoes.add(new Instruction(ponteiro, "JMF", new Item("?")));
  465. ponteiro++;
  466. pilhaDeDesvios.push(ponteiro - 1);
  467. }
  468. //ação #31: reconhecimento da palavra reservada untrue
  469. public void action31() {
  470. if (!execute) return;
  471. areaDeInstrucoes.add(new Instruction(ponteiro, "JMT", new Item("?")));
  472. ponteiro++;
  473. pilhaDeDesvios.push(ponteiro - 1);
  474. }
  475. //ação #32: reconhecimento da palavra reservada untrue (ou true)
  476. public void action32() {
  477. if (!execute) return;
  478. //desempilhar da pilha de desvios o endereço da instrução de desvio empilhado na ação #30 ou #31
  479. Integer endereçoInstruçãoDesvioAcao30_31 = pilhaDeDesvios.pop();
  480. //atualizar a instrução de desvio com: endereço = ponteiro + 1
  481. areaDeInstrucoes
  482. .stream()
  483. .filter(i -> i.getPointer() == endereçoInstruçãoDesvioAcao30_31)
  484. .findFirst()
  485. .ifPresent(i -> i.setParameter(new Item(ponteiro + 1)));
  486. //gerar instrução:(ponteiro, JMP, ?),onde endereço = ?
  487. areaDeInstrucoes.add(new Instruction(ponteiro, "JMP", new Item("?")));
  488. ponteiro++;
  489. //empilhar(ponteiro - 1) em pilha de desvios, ou seja, o endereço da instrução JMP
  490. pilhaDeDesvios.push(ponteiro - 1);
  491. }
  492. //ação #33: reconhecimento do início de expressão em comando de repetição
  493. public void action33() {
  494. if (!execute) return;
  495. pilhaDeDesvios.push(ponteiro);
  496. }
  497. //ação #34: reconhecimento de expressão em comando de repetição
  498. public void action34() {
  499. if (!execute) return;
  500. areaDeInstrucoes.add(new Instruction(ponteiro, "JMF", new Item("?")));
  501. ponteiro++;
  502. pilhaDeDesvios.push(ponteiro - 1);
  503. }
  504. //ação #35: reconhecimento do fim do comando de repetição
  505. public void action35() {
  506. if (!execute) return;
  507. //desempilhar da pilha de desvios o endereço da instrução de desvio empilhado na ação #34
  508. Integer endereçoInstruçãoDesvioAcao34 = pilhaDeDesvios.pop();
  509. //atualizar a instrução de desvio com: endereço ¬ ponteiro + 1
  510. areaDeInstrucoes
  511. .stream()
  512. .filter(i -> i.getPointer() == endereçoInstruçãoDesvioAcao34)
  513. .findFirst()
  514. .ifPresent(i -> i.setParameter(new Item(ponteiro + 1)));
  515. //desempilhar da pilha de desvios o endereço da instrução empilhado na ação #33
  516. Integer endereçoInstruçãoDesvioAcao33 = pilhaDeDesvios.pop();
  517. //gerar instrução: (ponteiro, JMP, “endereço”), onde "endereço" é igual ao valor desempilhado
  518. areaDeInstrucoes.add(new Instruction(ponteiro, "JMP", new Item(endereçoInstruçãoDesvioAcao33)));
  519. ponteiro++;
  520. }
  521. //ação #36: reconhecimento de operação relacional igual
  522. public void action36() {
  523. if (!execute) return;
  524. areaDeInstrucoes.add(new Instruction(ponteiro, "EQL", new Item(0)));
  525. ponteiro++;
  526. }
  527. //ação #37: reconhecimento de operação relacional igual
  528. public void action37() {
  529. if (!execute) return;
  530. areaDeInstrucoes.add(new Instruction(ponteiro, "DIF", new Item(0)));
  531. ponteiro++;
  532. }
  533. //ação #38: reconhecimento de operação relacional menor que
  534. public void action38() {
  535. if (!execute) return;
  536. areaDeInstrucoes.add(new Instruction(ponteiro, "SMR", new Item(0)));
  537. ponteiro++;
  538. }
  539. //ação #39: reconhecimento de operação relacional maior que
  540. public void action39() {
  541. if (!execute) return;
  542. areaDeInstrucoes.add(new Instruction(ponteiro, "BGR", new Item(0)));
  543. ponteiro++;
  544. }
  545. //ação #40: reconhecimento de operação relacional menor ou igual
  546. public void action40() {
  547. if (!execute) return;
  548. areaDeInstrucoes.add(new Instruction(ponteiro, "SME", new Item(0)));
  549. ponteiro++;
  550. }
  551. //ação #41: reconhecimento de operação relacional maior ou igual
  552. public void action41() {
  553. if (!execute) return;
  554. areaDeInstrucoes.add(new Instruction(ponteiro, "BGE", new Item(0)));
  555. ponteiro++;
  556. }
  557. //ação #42: reconhecimento de operação aritmética adição
  558. public void action42() {
  559. if (!execute) return;
  560. areaDeInstrucoes.add(new Instruction(ponteiro, "ADD", new Item(0)));
  561. ponteiro++;
  562. }
  563. //ação #43: reconhecimento de operação aritmética subtração
  564. public void action43() {
  565. if (!execute) return;
  566. areaDeInstrucoes.add(new Instruction(ponteiro, "SUB", new Item(0)));
  567. ponteiro++;
  568. }
  569. //reconhecimento de operação lógica OU ( | )
  570. public void action44() {
  571. if (!execute) return;
  572. areaDeInstrucoes.add(new Instruction(ponteiro, "OR", new Item(0)));
  573. ponteiro++;
  574. }
  575. //ação #45: reconhecimento de operação aritmética multiplicação
  576. public void action45() {
  577. if (!execute) return;
  578. areaDeInstrucoes.add(new Instruction(ponteiro, "MUL", new Item(0)));
  579. ponteiro++;
  580. }
  581. //ação #46: reconhecimento de operação aritmética divisão
  582. public void action46() {
  583. if (!execute) return;
  584. areaDeInstrucoes.add(new Instruction(ponteiro, "DIV", new Item(0)));
  585. ponteiro++;
  586. }
  587. //ação #47: reconhecimento de operação aritmética divisão inteira
  588. public void action47() {
  589. if (!execute) return;
  590. areaDeInstrucoes.add(new Instruction(ponteiro, "DIV", new Item(0)));
  591. ponteiro++;
  592. }
  593. //todo: maquina virtual ainda nao preparada para esta instrução
  594. //ação #48: reconhecimento de operação aritmética resto da divisão inteira
  595. public void action48() {
  596. if (!execute) return;
  597. areaDeInstrucoes.add(new Instruction(ponteiro, "MOD", new Item(0)));
  598. ponteiro++;
  599. }
  600. //ação #49: reconhecimento de operação lógica E (&)
  601. public void action49() {
  602. if (!execute) return;
  603. areaDeInstrucoes.add(new Instruction(ponteiro, "AND", new Item(0)));
  604. ponteiro++;
  605. }
  606. //todo: maquina virtual ainda nao preparada para esta instrução
  607. //ação #50: reconhecimento de operação aritmética potência
  608. public void action50() {
  609. if (!execute) return;
  610. areaDeInstrucoes.add(new Instruction(ponteiro, "POW", new Item(0)));
  611. ponteiro++;
  612. }
  613. //ação #51: reconhecimento de identificador de constante ou de variável e tamanho de variável indexada em expressão
  614. public void action51() {
  615. if (!execute) return;
  616. Integer atr1 = tabelaDeSimbolos.get(idArmazenadoAcao24).atr1;
  617. Integer atr2 = tabelaDeSimbolos.get(idArmazenadoAcao24).atr2;
  618. if (!variavelIndexada) {
  619. if (atr2 == null) {
  620. areaDeInstrucoes.add(new Instruction(ponteiro, "LDV", new Item(atr1)));
  621. ponteiro++;
  622. } else {
  623. erros.add(ERRO3 + idArmazenadoAcao24);
  624. }
  625. } else {
  626. if (atr2 != null) {
  627. areaDeInstrucoes.add(
  628. new Instruction(ponteiro, "LDV", new Item(atr1 + constIntArmazenadaAcao12 - 1)));
  629. ponteiro++;
  630. } else {
  631. erros.add(ERRO8 + idArmazenadoAcao24);
  632. }
  633. }
  634. }
  635. //ação #52: reconhecimento de constante lógica true
  636. public void action52() {
  637. if (!execute) return;
  638. areaDeInstrucoes.add(new Instruction(ponteiro, "LDB", new Item(true)));
  639. ponteiro++;
  640. }
  641. //ação #53: reconhecimento de constante lógica untrue
  642. public void action53() {
  643. if (!execute) return;
  644. areaDeInstrucoes.add(new Instruction(ponteiro, "LDB", new Item(false)));
  645. ponteiro++;
  646. }
  647. //ação #54: reconhecimento de operação lógica NÃO ( ! )
  648. public void action54() {
  649. if (!execute) return;
  650. areaDeInstrucoes.add(new Instruction(ponteiro, "NOT", new Item(0)));
  651. ponteiro++;
  652. }
  653. private Boolean identificadorJaDeclarado(String token) {
  654. if (tabelaDeSimbolos.containsKey(token) ||
  655. tabelaDeTiposEnumerados.containsKey(token) ||
  656. tabelaDeTiposEnumerados
  657. .entrySet()
  658. .stream()
  659. .filter(t -> t.getValue().contains(token))
  660. .findFirst()
  661. .isPresent()) {
  662. return true;
  663. }
  664. return false;
  665. }
  666. private Boolean isIdentificadorDeVariavel(String token) {
  667. return Stream.of(1, 2, 3, 4)
  668. .filter(n -> n.compareTo(tabelaDeSimbolos.get(token).categoria) == 0)
  669. .findFirst()
  670. .isPresent();
  671. }
  672. private Boolean isIdentificadorDeConstante(String token) {
  673. return Stream.of(5, 6, 7)
  674. .filter(n -> n.compareTo(tabelaDeSimbolos.get(token).categoria) == 0)
  675. .findFirst()
  676. .isPresent();
  677. }
  678. private Boolean isIdentificadorDeConstanteOuVariavel(String token) {
  679. return isIdentificadorDeVariavel(token) || isIdentificadorDeConstante(token);
  680. }
  681. @Override
  682. public String toString() {
  683. return "Tabela {\n" +
  684. " contexto = " + contexto + ",\n" +
  685. " ponteiro = " + ponteiro + ",\n" +
  686. " vt = " + vt + ",\n" +
  687. " vp = " + vp + ",\n" +
  688. " vi = " + vi + ",\n" +
  689. " tvi = " + tvi + ",\n" +
  690. " variavelIndexada = " + variavelIndexada + ",\n" +
  691. " pilhaDeDesvios = " + pilhaDeDesvios + ",\n" +
  692. " areaDeInstrucoes = " + getAreaInstrucoesAsString() + ",\n" +
  693. " tabelaDeSimbolos = " + getContentTabelasAsString(tabelaDeSimbolos) + ",\n" +
  694. " tupla=" + getContentTabelasAsString(tupla) + ",\n" +
  695. " erros=" + getListaDeErrosAsString() + "\n" +
  696. '}';
  697. }
  698. private String getContentTabelasAsString(Map<String, union> tabela) {
  699. if (tabela.isEmpty()) return "{}";
  700. List<String> list = tabela.entrySet().stream()
  701. .map(t -> t.getKey() + " = " + t.getValue().toString())
  702. .collect(Collectors.toList());
  703. String r = "{\n";
  704. for (String s : list) {
  705. r += " " + s + "\n";
  706. }
  707. return r + " }";
  708. }
  709. private String getAreaInstrucoesAsString() {
  710. if (areaDeInstrucoes.isEmpty()) return "{}";
  711. String r = "{\n";
  712. for (Instruction ai : areaDeInstrucoes) {
  713. r += " " + ai.toString() + "\n";
  714. }
  715. return r + " }";
  716. }
  717. private String getListaDeErrosAsString() {
  718. if (erros.isEmpty()) return "{}";
  719. String r = "{\n";
  720. for (String e : erros) {
  721. r += " " + e + "\n";
  722. }
  723. return r + " }";
  724. }
  725. public List<Instruction> getAreaDeInstrucoes() {
  726. return areaDeInstrucoes;
  727. }
  728. }