%{
#include <stdio.h>
/* Variáveis para controle do estado da nave */
int naveEstado = 0; /* 0: desligada, 1: ligada */
int naveAr = 0; /* 0: terra, 1: ar */
int posX = 0; /* Posição X atual */
int posY = 0; /* Posição Y atual */
int posZ = 0; /* Posição Z atual */
int direcao = 0; /* 0: +Y, 90: +X, 180: -Y, 270: -X */
/* Função para calcular movimento baseado na direção */
void calcularMovimento(int distancia, int* dx, int* dy) {
switch(direcao) {
case 0: *dx = 0; *dy = distancia; break; /* +Y */
case 90: *dx = distancia; *dy = 0; break; /* +X */
case 180: *dx = 0; *dy = -distancia; break; /* -Y */
case 270: *dx = -distancia; *dy = 0; break; /* -X */
}
}
%}
/* Definições das expressões regulares */
VOGAL [AEIOUaeiou]
LETRA [A-Za-z]
DIGITOS [0-9]{2,3}
DIRECAO [LR]
GRAUS ([1-9]|[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9])
NUMERO_POS [1-9][0-9]*
NUMERO_VERT [-]?[1-9][0-9]*
%%
"<On--"{VOGAL}{LETRA}"--"{DIGITOS}">" {
if(naveEstado == 0) {
printf("acao(ligar)\n");
naveEstado = 1;
} else {
printf("ERRO: A nave já está ligada!\n");
}
}
"<Off>" {
if(naveEstado == 1) {
if(naveAr == 0) {
printf("acao(desligar)\n");
naveEstado = 0;
} else {
printf("ERRO: A nave precisa estar em terra para ser desligada!\n");
}
} else {
printf("ERRO: A nave já está desligada!\n");
}
}
"<Take-Off>" {
if(naveEstado == 1) {
if(naveAr == 0) {
printf("Decolando...\n");
naveAr = 1;
} else {
printf("ERRO: A nave já está no ar!\n");
}
} else {
printf("ERRO: A nave precisa estar ligada para decolar!\n");
}
}
"<Land>" {
if(naveEstado == 1) {
if(naveAr == 1) {
if(posZ == 0) {
printf("Aterrissando...\n");
naveAr = 0;
} else {
printf("ERRO: A nave precisa estar na altura 0 para aterrissar!\n");
}
} else {
printf("ERRO: A nave já está em terra!\n");
}
} else {
printf("ERRO: A nave precisa estar ligada para aterrissar!\n");
}
}
"<Turn--"{DIRECAO}"--"{GRAUS}">" {
if(naveEstado == 1) {
char dir = yytext[7];
int graus;
sscanf(yytext + 10, "%d", &graus);
if(graus == 0 || graus >= 360) {
printf("ERRO: Graus inválidos (deve ser entre 1 e 359)!\n");
} else {
if(dir == 'R') {
direcao = (direcao + graus) % 360;
} else {
direcao = (direcao - graus + 360) % 360;
}
printf("Girando %c %d graus. Nova direção: %d\n", dir, graus, direcao);
}
} else {
printf("ERRO: A nave precisa estar ligada para girar!\n");
}
}
"<Move--"{NUMERO_POS}">" {
if(naveEstado == 1) {
int distancia;
sscanf(yytext + 7, "%d", &distancia);
int dx = 0, dy = 0;
calcularMovimento(distancia, &dx, &dy);
posX += dx;
posY += dy;
printf("move(%d,%d,0)\n", dx, dy);
} else {
printf("ERRO: A nave precisa estar ligada para se mover!\n");
}
}
"<Fly--"{NUMERO_VERT}">" {
if(naveEstado == 1) {
if(naveAr == 1) {
int altura;
sscanf(yytext + 6, "%d", &altura);
if(posZ + altura < 0) {
printf("ERRO: Movimento resultaria em altura negativa!\n");
} else {
posZ += altura;
printf("move(0,0,%d)\n", altura);
}
} else {
printf("ERRO: A nave precisa decolar antes de voar verticalmente!\n");
}
} else {
printf("ERRO: A nave precisa estar ligada para voar!\n");
}
}
. ; /* Ignora outros caracteres */
\n ; /* Ignora quebras de linha */
%%
int yywrap() {
return 1;
}
int main() {
printf("Simulador da Nave Iniciado\n");
printf("Posição inicial: (%d,%d,%d)\n", posX, posY, posZ);
yylex();
return 0;
}