fork download
  1. %{
  2. #include <stdio.h>
  3.  
  4. /* Variáveis para controle do estado da nave */
  5. int naveEstado = 0; /* 0: desligada, 1: ligada */
  6. int naveAr = 0; /* 0: terra, 1: ar */
  7. int posX = 0; /* Posição X atual */
  8. int posY = 0; /* Posição Y atual */
  9. int posZ = 0; /* Posição Z atual */
  10. int direcao = 0; /* 0: +Y, 90: +X, 180: -Y, 270: -X */
  11.  
  12. /* Função para calcular movimento baseado na direção */
  13. void calcularMovimento(int distancia, int* dx, int* dy) {
  14. switch(direcao) {
  15. case 0: *dx = 0; *dy = distancia; break; /* +Y */
  16. case 90: *dx = distancia; *dy = 0; break; /* +X */
  17. case 180: *dx = 0; *dy = -distancia; break; /* -Y */
  18. case 270: *dx = -distancia; *dy = 0; break; /* -X */
  19. }
  20. }
  21. %}
  22.  
  23. /* Definições das expressões regulares */
  24. VOGAL [AEIOUaeiou]
  25. LETRA [A-Za-z]
  26. DIGITOS [0-9]{2,3}
  27. DIRECAO [LR]
  28. GRAUS ([1-9]|[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9])
  29. NUMERO_POS [1-9][0-9]*
  30. NUMERO_VERT [-]?[1-9][0-9]*
  31.  
  32. %%
  33.  
  34. "<On--"{VOGAL}{LETRA}"--"{DIGITOS}">" {
  35. if(naveEstado == 0) {
  36. printf("acao(ligar)\n");
  37. naveEstado = 1;
  38. } else {
  39. printf("ERRO: A nave já está ligada!\n");
  40. }
  41. }
  42.  
  43. "<Off>" {
  44. if(naveEstado == 1) {
  45. if(naveAr == 0) {
  46. printf("acao(desligar)\n");
  47. naveEstado = 0;
  48. } else {
  49. printf("ERRO: A nave precisa estar em terra para ser desligada!\n");
  50. }
  51. } else {
  52. printf("ERRO: A nave já está desligada!\n");
  53. }
  54. }
  55.  
  56. "<Take-Off>" {
  57. if(naveEstado == 1) {
  58. if(naveAr == 0) {
  59. printf("Decolando...\n");
  60. naveAr = 1;
  61. } else {
  62. printf("ERRO: A nave já está no ar!\n");
  63. }
  64. } else {
  65. printf("ERRO: A nave precisa estar ligada para decolar!\n");
  66. }
  67. }
  68.  
  69. "<Land>" {
  70. if(naveEstado == 1) {
  71. if(naveAr == 1) {
  72. if(posZ == 0) {
  73. printf("Aterrissando...\n");
  74. naveAr = 0;
  75. } else {
  76. printf("ERRO: A nave precisa estar na altura 0 para aterrissar!\n");
  77. }
  78. } else {
  79. printf("ERRO: A nave já está em terra!\n");
  80. }
  81. } else {
  82. printf("ERRO: A nave precisa estar ligada para aterrissar!\n");
  83. }
  84. }
  85.  
  86. "<Turn--"{DIRECAO}"--"{GRAUS}">" {
  87. if(naveEstado == 1) {
  88. char dir = yytext[7];
  89. int graus;
  90. sscanf(yytext + 10, "%d", &graus);
  91.  
  92. if(graus == 0 || graus >= 360) {
  93. printf("ERRO: Graus inválidos (deve ser entre 1 e 359)!\n");
  94. } else {
  95. if(dir == 'R') {
  96. direcao = (direcao + graus) % 360;
  97. } else {
  98. direcao = (direcao - graus + 360) % 360;
  99. }
  100. printf("Girando %c %d graus. Nova direção: %d\n", dir, graus, direcao);
  101. }
  102. } else {
  103. printf("ERRO: A nave precisa estar ligada para girar!\n");
  104. }
  105. }
  106.  
  107. "<Move--"{NUMERO_POS}">" {
  108. if(naveEstado == 1) {
  109. int distancia;
  110. sscanf(yytext + 7, "%d", &distancia);
  111. int dx = 0, dy = 0;
  112. calcularMovimento(distancia, &dx, &dy);
  113. posX += dx;
  114. posY += dy;
  115. printf("move(%d,%d,0)\n", dx, dy);
  116. } else {
  117. printf("ERRO: A nave precisa estar ligada para se mover!\n");
  118. }
  119. }
  120.  
  121. "<Fly--"{NUMERO_VERT}">" {
  122. if(naveEstado == 1) {
  123. if(naveAr == 1) {
  124. int altura;
  125. sscanf(yytext + 6, "%d", &altura);
  126. if(posZ + altura < 0) {
  127. printf("ERRO: Movimento resultaria em altura negativa!\n");
  128. } else {
  129. posZ += altura;
  130. printf("move(0,0,%d)\n", altura);
  131. }
  132. } else {
  133. printf("ERRO: A nave precisa decolar antes de voar verticalmente!\n");
  134. }
  135. } else {
  136. printf("ERRO: A nave precisa estar ligada para voar!\n");
  137. }
  138. }
  139.  
  140. . ; /* Ignora outros caracteres */
  141. \n ; /* Ignora quebras de linha */
  142.  
  143. %%
  144.  
  145. int yywrap() {
  146. return 1;
  147. }
  148.  
  149. int main() {
  150. printf("Simulador da Nave Iniciado\n");
  151. printf("Posição inicial: (%d,%d,%d)\n", posX, posY, posZ);
  152. yylex();
  153. return 0;
  154. }
Success #stdin #stdout #stderr 0.03s 6884KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
ERROR: /home/51MGye/prog:154:0: Syntax error: end_of_file_in_quasi_quotation
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit