Type in the content of your new page here.

en este ejercicio construimos un pequeño interprete capaz de leer un archivo y analizarlo para ejecutar las instrucciones del mismo , para locual definimos el lenguaje hola mundo que consta de la funcion print , la cual recibe como argumentos un string o un numero , ademas cada instruccion debe terminar en punto y coma (;)

scanner

%%
%line
[0-9]+               { return NUMERO; }
[a-zA-Z]+          { return IDENTIFICADOR;  }
[\"][a-zA-Z\ \!\#\$\%]+[\"]  { return CADENA;  }
[\;]             {return FinSecuencia;}
[\ \n\t]         { }
.                    { return -1;  }
%%

parser


#define DESCONOCIDO -1
#define NUMERO 1
#define CADENA 2
#define IDENTIFICADOR 3
#define FinSecuencia 4
 
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "scanner.h"
 
char * obtenerLexema(void){
  /* Devuelve el lexema actual encontrado */
  return yytext;
};
 
void cargarArchivo(char* filename){
  yyin = fopen(filename,"r");
};
 
char * obtenerLexema(void);
void cargarArchivo(char*);
 
int main (int cargs , char * args[]){
 clrscr();
 char * palabra;
 int tipo = 0;
  cargarArchivo("texto.txt");
  nuevalinea:
  while(yylex()!=0) {
    palabra = obtenerLexema();
      if (strcmp(palabra,"print")==0){ // Si el primer token de la linea es print
      printf("compiler>PRINT encontrado, se espera un string o un numero\n",tipo);
    //Nos movemos al siguiente token
    printf("->%s\n",yytext);
    tipo = yylex();
    printf("compiler>tipo=%d , valor={%s}\n",tipo,yytext);
    if( tipo==CADENA || tipo==NUMERO){
      switch(tipo){
        case CADENA: {
          printf("(%s)\n",yytext);
        } break;
 
        case NUMERO: {
          printf("($%s)\n",yytext);
        } break;
      }//End select case
      tipo = yylex(); // movemos al siguiente token
      if(tipo==FinSecuencia){
        printf("");
        goto nuevalinea;
      }else{
        printf("compiler>Error, se esperaba fin de linea\n");
        getch();
        return 0;
      }
    } else {
       printf("(Error en el token(%s) )\n" , yytext );
      break;
       }
      } else {
      // End if PRINT
    printf("Error palabra no definida, (%s)",yytext);
      }
  }//End while
 getch();
  return 0;
}