lisp.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /* Código gerado automaticamente */
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #define ESPACO_MEM 100
  6. static int listas[ESPACO_MEM*2 +1];
  7. static int pilha[ESPACO_MEM+1];
  8. static int simbolos[ESPACO_MEM*3 +1];
  9. static void adc_carac_simbolo(
  10. int carac
  11. );
  12. static void adc_pilha(
  13. int valor
  14. );
  15. static void avaliar(void);
  16. static void celula_lateral(
  17. int valor
  18. );
  19. static void def_topo_pilha(
  20. int valor
  21. );
  22. static int desc_topo_pilha(void);
  23. static void erro(
  24. char *msg
  25. );
  26. static void fechar_nivel(void);
  27. static void limpar_simbolos(void);
  28. static void mostrar_simbolo(
  29. int indice
  30. );
  31. static void novo_nivel(void);
  32. static inline void adc_lista_vazia(void);
  33. static inline void def_ponteiro_lista(
  34. int indice,
  35. int ponteiro
  36. );
  37. static inline void def_valor_lista(
  38. int indice,
  39. int valor
  40. );
  41. static inline void limpar_listas(void);
  42. static inline void limpar_pilha(void);
  43. static inline int ponteiro_lista(
  44. int indice
  45. );
  46. static inline int tam_pilha(void);
  47. static inline int topo_pilha(void);
  48. static inline int ult_simbolo(void);
  49. static inline int valor_lista(
  50. int indice
  51. );
  52. static inline void adc_lista_vazia(void) {
  53. if (listas[0] == ESPACO_MEM) {
  54. erro("Espaço de memória insuficiente");
  55. } else {
  56. }
  57. listas[ listas[0]*2+1 ] = 0;
  58. listas[ listas[0]*2+2 ] = 0;
  59. listas[0] ++;
  60. }
  61. static inline void def_ponteiro_lista(
  62. int indice,
  63. int ponteiro
  64. ) {
  65. listas[ (indice-1)*2+2 ] = ponteiro;
  66. }
  67. static inline void def_valor_lista(
  68. int indice,
  69. int valor
  70. ) {
  71. listas[ (indice-1)*2+1 ] = valor;
  72. }
  73. static inline void limpar_listas(void) {
  74. listas[0] = 0;
  75. }
  76. static inline void limpar_pilha(void) {
  77. pilha[0] = 0;
  78. }
  79. static inline int ponteiro_lista(
  80. int indice
  81. ) {
  82. return listas[ (indice-1)*2+2 ];
  83. }
  84. static inline int tam_pilha(void) {
  85. return pilha[0];
  86. }
  87. static inline int topo_pilha(void) {
  88. return pilha[ pilha[0] ];
  89. }
  90. static inline int ult_simbolo(void) {
  91. return simbolos[0];
  92. }
  93. static inline int valor_lista(
  94. int indice
  95. ) {
  96. return listas[ (indice-1)*2+1 ];
  97. }
  98. static void adc_carac_simbolo(
  99. int carac
  100. ) {
  101. if (simbolos[0] == ESPACO_MEM*3) {
  102. erro("Estouro de símbolos");
  103. } else {
  104. }
  105. simbolos[ ++simbolos[0] ] = carac;
  106. }
  107. static void adc_pilha(
  108. int valor
  109. ) {
  110. if (pilha[0] == ESPACO_MEM) {
  111. erro("Estouro de pilha");
  112. } else {
  113. }
  114. pilha[ ++pilha[0] ] = valor;
  115. }
  116. static void avaliar(void) {
  117. int ult_lista;
  118. while (getchar() != '\n');;
  119. limpar_pilha();
  120. adc_pilha(1);
  121. item_165 :
  122. ult_lista = topo_pilha();
  123. def_topo_pilha(ponteiro_lista(ult_lista));
  124. if (valor_lista(ult_lista) < 0) {
  125. mostrar_simbolo(-valor_lista(ult_lista));
  126. goto item_180;
  127. } else {
  128. }
  129. if (valor_lista(ult_lista) != 0) {
  130. putchar('(');
  131. adc_pilha(valor_lista(ult_lista));
  132. } else {
  133. }
  134. item_180 :
  135. if (topo_pilha() == 0) {
  136. } else {
  137. goto item_165;
  138. }
  139. if (pilha[0] == 1) {
  140. putchar('\n');
  141. limpar_listas();
  142. adc_lista_vazia();
  143. limpar_pilha();
  144. adc_pilha(1);
  145. limpar_simbolos();
  146. } else {
  147. putchar(')');
  148. desc_topo_pilha();
  149. goto item_180;
  150. }
  151. }
  152. static void celula_lateral(
  153. int valor
  154. ) {
  155. int ult_lista = topo_pilha();
  156. adc_lista_vazia();
  157. def_ponteiro_lista(ult_lista, listas[0]);
  158. def_valor_lista(ult_lista, valor);
  159. def_topo_pilha(listas[0]);
  160. }
  161. static void def_topo_pilha(
  162. int valor
  163. ) {
  164. pilha[ pilha[0] ] = valor;
  165. }
  166. static int desc_topo_pilha(void) {
  167. if (pilha[0] == 0) {
  168. erro("Tentou descartar topo de pilha vazia");
  169. } else {
  170. }
  171. return pilha[ pilha[0]-- ];
  172. }
  173. static void erro(
  174. char *msg
  175. ) {
  176. puts(msg);
  177. exit(1);
  178. }
  179. static void fechar_nivel(void) {
  180. if (pilha[0] == 1) {
  181. erro(") sobrando");
  182. } else {
  183. }
  184. desc_topo_pilha();
  185. adc_lista_vazia();
  186. int ult_lista = topo_pilha();
  187. def_ponteiro_lista(ult_lista, listas[0]);
  188. def_topo_pilha(listas[0]);
  189. }
  190. static void limpar_simbolos(void) {
  191. simbolos[0] = 0;
  192. }
  193. static void mostrar_simbolo(
  194. int indice
  195. ) {
  196. item_137 :
  197. if (simbolos[indice] != 0) {
  198. putchar(simbolos[indice]);
  199. indice++;
  200. goto item_137;
  201. } else {
  202. }
  203. }
  204. static void novo_nivel(void) {
  205. int ult_lista = topo_pilha();
  206. adc_lista_vazia();
  207. def_valor_lista(ult_lista, listas[0]);
  208. adc_pilha(listas[0]);
  209. }
  210. int main(void) {
  211. int carac;
  212. int comeco_simbolo = 0;
  213. adc_lista_vazia();
  214. adc_pilha(1);
  215. item_195 :
  216. if ((carac = getchar()) != EOF) {
  217. } else {
  218. return 0;
  219. }
  220. if (carac == '(') {
  221. } else {
  222. goto item_2060002;
  223. }
  224. if (comeco_simbolo) {
  225. adc_carac_simbolo(0);
  226. celula_lateral(-comeco_simbolo);
  227. comeco_simbolo = 0;
  228. } else {
  229. }
  230. novo_nivel();
  231. goto item_195;
  232. item_2060002 :
  233. if (carac == ')') {
  234. } else {
  235. goto item_2060003;
  236. }
  237. if (comeco_simbolo) {
  238. adc_carac_simbolo(0);
  239. celula_lateral(-comeco_simbolo);
  240. comeco_simbolo = 0;
  241. } else {
  242. }
  243. fechar_nivel();
  244. goto item_195;
  245. item_2060003 :
  246. if (carac == '.') {
  247. } else {
  248. goto item_244;
  249. }
  250. if (comeco_simbolo) {
  251. adc_carac_simbolo(0);
  252. celula_lateral(-comeco_simbolo);
  253. comeco_simbolo = 0;
  254. } else {
  255. }
  256. avaliar();
  257. goto item_195;
  258. item_244 :
  259. if (comeco_simbolo) {
  260. } else {
  261. comeco_simbolo = ult_simbolo()+1;
  262. }
  263. adc_carac_simbolo(carac);
  264. goto item_195;
  265. }