/testesDeUnidade/analisadorSintáticoTeste.py

https://gitlab.com/danielbbruno/SimuS · Python · 339 lines · 286 code · 53 blank · 0 comment · 0 complexity · e17155a18a303cae401efecc091f1c01 MD5 · raw file

  1. import unittest
  2. from SimuS.compilador import Símbolo, AnalisadorSintático
  3. from SimuS.compilador import exceções
  4. from SimuS.simulador import Memória, parâmetros
  5. from SimuS.compilador.analisadorLéxicoBase import Símbolo
  6. from SimuS.compilador.analisadorLéxicoBase import Símbolo
  7. class AnalisadorSintáticoCasoDeTeste(unittest.TestCase):
  8. def setUp(self):
  9. self.mem = Memória(tamanhoDoEndereço = parâmetros.tamanhoDoEndereço,
  10. tamanhoDaPalavra = parâmetros.tamanhoDaPalavra,
  11. ordemDosBytes=parâmetros.endianness)
  12. self.novaMem = Memória(tamanhoDoEndereço = parâmetros.tamanhoDoEndereço,
  13. tamanhoDaPalavra = parâmetros.tamanhoDaPalavra,
  14. ordemDosBytes=parâmetros.endianness)
  15. def testeAnalisadorSintático1(self):
  16. tokens = [
  17. Símbolo("DefiniçãoDeRótulo", "ZERO"), Símbolo("Operador", "ADC"), Símbolo("Rótulo", "VAR"), Símbolo("NovaLinha"),
  18. Símbolo("Operador", "JZ"), Símbolo("Rótulo", "FIM"), Símbolo("NovaLinha"),
  19. Símbolo("Operador", "JMP"), Símbolo("Rótulo", "ZERO"), Símbolo("NovaLinha"),
  20. Símbolo("DefiniçãoDeRótulo", "FIM"), Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  21. Símbolo("DefiniçãoDeRótulo", "VAR"), Símbolo("Diretiva", "DW"), Símbolo("Numeral", 0xAAee), Símbolo("EOF")
  22. ]
  23. asin = AnalisadorSintático(tokens, self.mem)
  24. asin.iniciaAnálise()
  25. varRótulo = (10).to_bytes(2, "little")
  26. fimRótulo = (9).to_bytes(2, "little")
  27. zeroRótulo = (0).to_bytes(2, "little")
  28. código = bytearray((0x34, varRótulo[0], varRótulo[1],
  29. 0xa0,fimRótulo[0], fimRótulo[1],
  30. 0x80,zeroRótulo[0], zeroRótulo[1],
  31. 0xFF,
  32. 0xEE, 0xAA))
  33. self.novaMem[:len(código)] = código
  34. self.assertEquals(self.mem.dados, self.novaMem.dados)
  35. self.assertEquals(len(self.mem.dados), len(self.novaMem.dados))
  36. def testeAnalisadorSintático2(self):
  37. tokens = [
  38. Símbolo("Diretiva", "ORG"), Símbolo("Numeral", 104), Símbolo("NovaLinha"),
  39. Símbolo("DefiniçãoDeRótulo", "INI"), Símbolo("Operador", "LDA"), Símbolo("Rótulo", "VAR"), Símbolo("NovaLinha"),
  40. Símbolo("Operador", "STA"), Símbolo("Rótulo", "VAR"), Símbolo("NovaLinha"),
  41. Símbolo("Operador", "SUB"), Símbolo("#"), Símbolo("Numeral", 100), Símbolo("NovaLinha"),
  42. Símbolo("Operador", "JN"), Símbolo("Rótulo", "FIM"), Símbolo("NovaLinha"),
  43. Símbolo("DefiniçãoDeRótulo", "FIM"), Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  44. Símbolo("DefiniçãoDeRótulo", "var"), Símbolo("Diretiva", "DW"), Símbolo("Numeral", 0), Símbolo("EOF")
  45. ]
  46. asin = AnalisadorSintático(tokens, self.mem)
  47. asin.iniciaAnálise()
  48. varRótulo = list((104 + 13).to_bytes(2, "little"))
  49. fimRótulo = list((104 + 12).to_bytes(2, "little"))
  50. código = [0x20, varRótulo[0], varRótulo[1],
  51. 0x10, varRótulo[0], varRótulo[1],
  52. 0x3A, 100, 0,
  53. 0x90, fimRótulo[0], fimRótulo[1],
  54. 0xFF,]
  55. self.novaMem[104:104+len(código)] = código
  56. self.assertEquals(self.mem.dados, self.novaMem.dados)
  57. def testeAnalisadorSintáticoSequência1(self):
  58. tokens = [Símbolo("NovaLinha"),
  59. Símbolo("DefiniçãoDeRótulo", "VET"), Símbolo("Diretiva", "DW"), Símbolo("Numeral", 32),
  60. Símbolo(","), Símbolo("Numeral", 17), Símbolo(","), Símbolo("Numeral", 89),
  61. Símbolo("EOF"),
  62. ]
  63. código = [0x20, 0x00, 0x11, 0x00, 0x59, 0x00]
  64. self.novaMem[:len(código)] = código
  65. asin = AnalisadorSintático(tokens, self.mem)
  66. asin.iniciaAnálise()
  67. self.assertEquals(self.mem.dados, self.novaMem.dados)
  68. def testeAnalisadorSintáticoSequência2(self):
  69. tokens = [Símbolo("NovaLinha"),
  70. Símbolo("DefiniçãoDeRótulo", "VET"), Símbolo("Diretiva", "DB"), Símbolo("Numeral", 32),
  71. Símbolo(","), Símbolo("Numeral", 17), Símbolo(","), Símbolo("Numeral", 89),
  72. Símbolo("EOF"),
  73. ]
  74. código = [0x20, 0x11, 0x59]
  75. self.novaMem[:len(código)] = código
  76. asin = AnalisadorSintático(tokens, self.mem)
  77. asin.iniciaAnálise()
  78. self.assertEquals(self.mem.dados, self.novaMem.dados)
  79. def testeAnalisadorSintáticoString(self,):
  80. tokens = [
  81. Símbolo("Diretiva", "STR"), Símbolo("CadeiaDeCaracteres", "AZaz19"), Símbolo("NovaLinha"),
  82. Símbolo("Diretiva", "DW"), Símbolo("Numeral", 0xFF), Símbolo("NovaLinha"),
  83. Símbolo("EOF"),
  84. ]
  85. código = [0x41, 0x5a, 0x61, 0x7a, 0x31, 0x39, 0x00, 0xFF, 0x00]
  86. self.novaMem[:len(código)] = código
  87. asin = AnalisadorSintático(tokens, self.mem)
  88. asin.iniciaAnálise()
  89. self.assertEquals(self.mem.dados, self.novaMem.dados)
  90. def testeORG1(self):
  91. tokens = [
  92. Símbolo("Diretiva", "ORG"), Símbolo("Numeral", 2), Símbolo("NovaLinha"),
  93. Símbolo("Operador", "ADD"), Símbolo("Numeral", 54), Símbolo("NovaLinha"),
  94. Símbolo("Operador", "SHL"), Símbolo("NovaLinha"),
  95. Símbolo("Operador", "SHR"), Símbolo("NovaLinha"),
  96. Símbolo("Diretiva", "ORG"), Símbolo("Numeral", 6), Símbolo("NovaLinha"),
  97. Símbolo("Operador", "HLT"), Símbolo("EOF")]
  98. asin = AnalisadorSintático(tokens, self.mem)
  99. self.assertRaises(exceções.ExceçãoUsoIncorretoDaMemória, asin.iniciaAnálise)
  100. def testeORG2(self):
  101. tokens = [
  102. Símbolo("Operador", "ADD"), Símbolo("Numeral", 54), Símbolo("NovaLinha"),
  103. Símbolo("Operador", "SHL"), Símbolo("NovaLinha"),
  104. Símbolo("Diretiva", "ORG"), Símbolo("Numeral", 0), Símbolo("NovaLinha"),
  105. Símbolo("Diretiva", "DW"), Símbolo("Numeral", 0), Símbolo("NovaLinha"),
  106. Símbolo("Operador", "HLT"), Símbolo("EOF")]
  107. asin = AnalisadorSintático(tokens, self.mem)
  108. self.assertRaises(exceções.ExceçãoUsoIncorretoDaMemória, asin.iniciaAnálise)
  109. def testeORG3(self):
  110. tokens = [
  111. Símbolo("Diretiva", "ORG"), Símbolo("Numeral", 2), Símbolo("NovaLinha"),
  112. Símbolo("Operador", "ADD"), Símbolo("#"), Símbolo("Numeral", 123), Símbolo("NovaLinha"),
  113. Símbolo("Diretiva", "ORG"), Símbolo("Numeral", 5), Símbolo("NovaLinha"),
  114. Símbolo("Operador", "JMP"), Símbolo("Numeral", 0), Símbolo("NovaLinha"),
  115. Símbolo("Operador", "HLT"), Símbolo("EOF")]
  116. asin = AnalisadorSintático(tokens, self.mem)
  117. asin.iniciaAnálise()
  118. código = [50, 123, 0 , 128, 0, 0, 255]
  119. self.novaMem[2:2+len(código)] = código
  120. self.assertEquals(self.mem.dados, self.novaMem.dados)
  121. def testeEQU1(self):
  122. tokens = [
  123. Símbolo("Operador", "LDA"), Símbolo("Rótulo", "MAX"), Símbolo("NovaLinha"),
  124. Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  125. Símbolo("Rótulo", "MAX"), Símbolo("Diretiva", "EQU"), Símbolo("Numeral", 1223), Símbolo("EOF")]
  126. asin = AnalisadorSintático(tokens, self.mem)
  127. asin.iniciaAnálise()
  128. código = [0x20, 0xc7, 0x04, 0xFF]
  129. self.mem[:len(código)] = código
  130. self.assertEquals(self.mem.dados, asin.memória.dados)
  131. def testeEQU2(self):
  132. tokens = [
  133. Símbolo("Operador", "ADD"), Símbolo("Rótulo", "VALUE"), Símbolo("NovaLinha"),
  134. Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  135. Símbolo("Rótulo", "VALUE"), Símbolo("Diretiva", "EQU"), Símbolo("Numeral", 18), Símbolo("EOF")
  136. ]
  137. asin = AnalisadorSintático(tokens, self.mem)
  138. asin.iniciaAnálise()
  139. código = [0x30, 0x12, 0x00, 0xFF]
  140. self.mem[:len(código)] = código
  141. self.assertEquals(self.mem.dados, asin.memória.dados)
  142. def testeEQU3(self):
  143. tokens = [
  144. Símbolo("Operador", "ADD"), Símbolo("#"), Símbolo("Rótulo", "VALUE"), Símbolo("NovaLinha"),
  145. Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  146. Símbolo("Rótulo", "VALUE"), Símbolo("Diretiva", "EQU"), Símbolo("Numeral", 18), Símbolo("EOF")
  147. ]
  148. asin = AnalisadorSintático(tokens, self.mem)
  149. asin.iniciaAnálise()
  150. código = [0x32, 0x12, 0xFF]
  151. self.mem[:len(código)] = código
  152. self.assertEquals(self.mem.dados, asin.memória.dados)
  153. def testeDS(self):
  154. tokens = [
  155. Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  156. Símbolo("Diretiva", "DS"), Símbolo("Numeral", 12), Símbolo("NovaLinha"),
  157. Símbolo("Operador", "HLT"), Símbolo("EOF")
  158. ]
  159. asin = AnalisadorSintático(tokens, self.mem)
  160. asin.iniciaAnálise()
  161. self.novaMem[0] = 0xFF
  162. self.novaMem[13] = 0xFF
  163. self.assertIn((1, "DS", 12, 1), asin.endereçosDasAlocações)
  164. self.assertEquals(self.novaMem.dados, self.mem.dados)
  165. def testeDW(self):
  166. tokens = [
  167. Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  168. Símbolo("Diretiva", "DW"), Símbolo("Numeral", 12), Símbolo("NovaLinha"),
  169. Símbolo("Operador", "HLT"), Símbolo("EOF")
  170. ]
  171. asin = AnalisadorSintático(tokens, self.mem)
  172. asin.iniciaAnálise()
  173. self.novaMem[0] = 0xFF
  174. self.novaMem[1] = 12
  175. self.novaMem[3] = 0xFF
  176. self.assertIn((1, "DW", self.mem.tamanhoDoEndereço, 1), asin.endereçosDasAlocações)
  177. self.assertEquals(self.mem.dados, self.novaMem.dados)
  178. def testeDeslocamento(self):
  179. tokens = [ Símbolo("Operador", "LDA"), Símbolo("Rótulo", "var"), Símbolo("+"), Símbolo("Numeral", 0b101), Símbolo("NovaLinha"),
  180. Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  181. Símbolo("DefiniçãoDeRótulo", "var"), Símbolo("Diretiva", "DS"), Símbolo("Numeral", 10), Símbolo("EOF") ]
  182. asin = AnalisadorSintático(tokens, self.mem)
  183. asin.iniciaAnálise()
  184. código = [0x20, 0x04 + 5, 0x00, 0xFF]
  185. self.novaMem[:len(código)] = código
  186. self.assertEquals(self.mem.dados, self.novaMem.dados)
  187. def testeExceçãoOperandoInválido1(self):
  188. tokens = [Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  189. Símbolo("Diretiva","DS"), Símbolo("Numeral", 0), Símbolo("EOF")]
  190. asin = AnalisadorSintático(tokens, self.mem)
  191. self.assertRaises(exceções.ExceçãoOperandoInválido,asin.iniciaAnálise)
  192. def testeExceçãoOperandoInválido2(self):
  193. tokens = [Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  194. Símbolo("Diretiva","DW"), Símbolo("Numeral", 0xFFFF+1), Símbolo("EOF")]
  195. asin = AnalisadorSintático(tokens, self.mem)
  196. self.assertRaises(exceções.ExceçãoOperandoInválido, asin.iniciaAnálise)
  197. def testeExceçãoOperandoInválido2(self):
  198. tokens = [Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  199. Símbolo("Diretiva","DB"), Símbolo("Numeral", 0xFF+1), Símbolo("EOF")]
  200. asin = AnalisadorSintático(tokens, self.mem)
  201. self.assertRaises(exceções.ExceçãoOperandoInválido, asin.iniciaAnálise)
  202. def testeExceçãoValorForaDosLimites(self):
  203. tokens = [Símbolo("Operador", "SUB"), Símbolo("Numeral", 0xFFFF + 1), Símbolo("EOF")]
  204. asin = AnalisadorSintático(tokens, self.mem)
  205. self.assertRaises(exceções.ExceçãoValorForaDosLimites, asin.iniciaAnálise)
  206. def testeExceçãoValorForaDosLimites2(self):
  207. tokens = [Símbolo("Rótulo", "var"), Símbolo("Diretiva", "EQU"), Símbolo("Numeral", 0xFFFF +1), Símbolo("NovaLinha"),
  208. Símbolo("Operador", "ADD"), Símbolo("Rótulo", "var"), Símbolo("EOF")]
  209. asin = AnalisadorSintático(tokens, self.mem)
  210. self.assertRaises(exceções.ExceçãoValorForaDosLimites, asin.iniciaAnálise)
  211. def testeSímboloInesperado1(self):
  212. tokens = [Símbolo("Operador", "ADD"), Símbolo("Numeral", 18), Símbolo("Operador", "ADD"), Símbolo("Numeral", 18), Símbolo("EOF")]
  213. asin = AnalisadorSintático(tokens, self.mem)
  214. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  215. def testeSímboloInesperado2(self):
  216. tokens = [Símbolo("DefiniçãoDeRótulo", "var"), Símbolo("DefiniçãoDeRótulo", "teste"),
  217. Símbolo("Operador", "ADD"), Símbolo("Numeral", 123), Símbolo("EOF")]
  218. asin = AnalisadorSintático(tokens, self.mem)
  219. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  220. def testeSímboloInesperado3(self):
  221. tokens = [Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  222. Símbolo("Rótulo", "var"), Símbolo("Diretiva", "EQU"), Símbolo("Operador", "ADD"),
  223. Símbolo("EOF")]
  224. asin = AnalisadorSintático(tokens, self.mem)
  225. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  226. def testeSímboloInesperado4(self):
  227. tokens = [Símbolo("Operador", "HLT"), Símbolo("NovaLinha"),
  228. Símbolo("DefiniçãoDeRótulo", "var"), Símbolo("Diretiva", "END"), Símbolo("Numeral", 13), Símbolo("NovaLinha"),
  229. Símbolo("EOF")]
  230. asin = AnalisadorSintático(tokens, self.mem)
  231. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  232. def testeSímboloInesperado5(self):
  233. tokens = [Símbolo("Operador", "HLT"), Símbolo("Numeral", 13), Símbolo("EOF")]
  234. asin = AnalisadorSintático(tokens, self.mem)
  235. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  236. def testeSímboloInesperado6(self):
  237. tokens = [Símbolo("Operador", "SHL"), Símbolo("Numeral", 13), Símbolo("EOF")]
  238. asin = AnalisadorSintático(tokens, self.mem)
  239. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  240. def testeSímboloInesperado7(self):
  241. tokens = [Símbolo("Operador", "JMP"), Símbolo("#"), Símbolo("EOF")]
  242. asin = AnalisadorSintático(tokens, self.mem)
  243. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  244. def testeSímboloInesperado8(self):
  245. tokens = [Símbolo("DefiniçãoDeRótulo", "var"), Símbolo("Diretiva", "ORG"), Símbolo("Numeral", 13), Símbolo("NovaLinha"),
  246. Símbolo("Operador", "HLT"), Símbolo("EOF")]
  247. asin = AnalisadorSintático(tokens, self.mem)
  248. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  249. def testeSímboloInesperado9(self):
  250. tokens = [Símbolo("Operador", "ADD"), Símbolo("Operador", "ADD"), Símbolo("NovaLinha"),
  251. Símbolo("Operador", "HLT"), Símbolo("EOF")]
  252. asin = AnalisadorSintático(tokens, self.mem)
  253. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  254. def testeSímboloInesperado10(self):
  255. tokens = [Símbolo("Operador", "ADD"), Símbolo("@"), Símbolo("Operador", "ADD"), Símbolo("NovaLinha"),
  256. Símbolo("Operador", "HLT"), Símbolo("EOF")]
  257. asin = AnalisadorSintático(tokens, self.mem)
  258. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  259. def testeSímboloInesperado11(self):
  260. tokens = [Símbolo("Operador", "ADD"), Símbolo("@"), Símbolo("Numeral", 12), Símbolo("NovaLinha"),
  261. Símbolo("Diretiva", "ORG"), Símbolo("EOF")]
  262. asin = AnalisadorSintático(tokens, self.mem)
  263. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  264. def testeSímboloInesperado12(self):
  265. tokens = [Símbolo("Operador", "LDA"), Símbolo("@"), Símbolo("Numeral", 12), Símbolo("NovaLinha"),
  266. Símbolo("Diretiva", "EQU"), Símbolo("EOF")]
  267. asin = AnalisadorSintático(tokens, self.mem)
  268. self.assertRaises(exceções.ExceçãoSímboloInesperado, asin.iniciaAnálise)
  269. def testeRótuloInválido1(self):
  270. tokens = [Símbolo("DefiniçãoDeRótulo", "var"), Símbolo("Operador", "ADD"), Símbolo("Numeral", 123), Símbolo("NovaLinha"),
  271. Símbolo("DefiniçãoDeRótulo", "var"), Símbolo("Operador", "ADD"), Símbolo("Numeral", 123),
  272. Símbolo("EOF")]
  273. asin = AnalisadorSintático(tokens, self.mem)
  274. self.assertRaises(exceções.ExceçãoDefiniçãoDeRótuloRepetida, asin.iniciaAnálise)
  275. def testeRótuloInválido2(self):
  276. tokens = [Símbolo("DefiniçãoDeRótulo", "var"), Símbolo("Operador", "ADD"), Símbolo("Numeral", 13), Símbolo("NovaLinha"),
  277. Símbolo("Rótulo", "var"), Símbolo("Diretiva", "EQU"), Símbolo("Numeral", 12),
  278. Símbolo("EOF")]
  279. asin = AnalisadorSintático(tokens, self.mem)
  280. self.assertRaises(exceções.ExceçãoDefiniçãoDeRótuloRepetida, asin.iniciaAnálise)
  281. def testeRótuloInválido3(self):
  282. tokens = [Símbolo("Rótulo", "var"), Símbolo("Diretiva", "EQU"), Símbolo("Numeral", 13), Símbolo("NovaLinha"),
  283. Símbolo("Rótulo", "var"), Símbolo("Diretiva", "EQU"), Símbolo("Numeral", 2),
  284. Símbolo("EOF")]
  285. asin = AnalisadorSintático(tokens, self.mem)
  286. self.assertRaises(exceções.ExceçãoDefiniçãoDeRótuloRepetida, asin.iniciaAnálise)