/* PERMITIR EL LENGUAJE DE SQL PARA ARCHIVOS DBF */ /* --------------------------------------------------------- --- Programa: dbf.yac --- --- TEcnica: Dirigida por la sintAxis --- --- Objetivo: Permitir el lenguaje de SQL para DBF --- --- Programador: J. Rafael R. ochoa --- ---------------------------------------------------------*/ %{ #include "dbf.h" %} %union { char str[80]; } %token <str> COMA LEFT RIGHT IGUAL LINEA SALIR GO INSERT INTO %token <str> VALUES DELETE FROM WHERE SELECT UPDATE CREATE TABLE DROP %token <str> APOSTROFE NOT_NULL SET AND OR CHAR INT ASTERISCO %token <str> NUMERO BDD TEXTO %type <str> insert delete select update tables datos dato criterio %type <str> view list_view estructura not_null tipo cambios crit_list %% /* producciones de la gramatica */ entrada : expr | expr entrada | error LINEA { printf("\n:-) "); } entrada ; expr : SALIR LINEA { return 1; } | insert GO LINEA { printf("\n:-) "); } /* ok */ | delete GO LINEA { printf("\n:-) "); } /* ok */ | select GO LINEA { printf("\n:-) "); } /* ok */ | update GO LINEA { printf("\n:-) "); } /* ok */ | tables GO LINEA { printf("\n:-) "); } /* ok */ ; insert : INSERT INTO BDD VALUES LEFT datos RIGHT { insertar($3); datos_insert=NULL; } ; delete : DELETE FROM BDD criterio { delete($3); filtros = NULL; } ; select : SELECT view FROM BDD criterio { consulta($4); filtros = NULL; field_req = NULL; } ; update : UPDATE BDD SET cambios criterio { update($2); filtros = NULL; datos_insert=NULL; cambios = NULL; } ; tables : CREATE TABLE BDD LEFT estructura RIGHT { sprintf($$,"create table %s (%s)\\g",$3,$5); } | DROP TABLE BDD { sprintf($$,"drop table %s\\g",$3); } ; datos : dato { read_insert($1); } | dato COMA datos { read_insert($1); } ; dato : APOSTROFE TEXTO APOSTROFE { sprintf($$,"%s",$2); } | NUMERO { sprintf($$,"%s",$1); } ; criterio : {sprintf($$,"%s","rafa"); filtros = NULL;} /* todos */ | WHERE crit_list ; crit_list : TEXTO IGUAL dato { read_filtros($1,$3); } | TEXTO IGUAL dato AND crit_list { read_filtros($1,$3); } ; cambios : TEXTO IGUAL dato { read_cambios($1,$3); } | TEXTO IGUAL dato COMA cambios { read_cambios($1,$3); } view : ASTERISCO { read_campos("*"); } | list_view ; list_view : TEXTO {read_campos($1);} | TEXTO COMA list_view {read_campos($1);} ; estructura: TEXTO tipo LEFT NUMERO RIGHT not_null { sprintf($$,"%s %s (%s)%s",$1,$2,$4,$6); } | TEXTO tipo LEFT NUMERO RIGHT not_null COMA estructura { sprintf($$,"%s %s (%s)%s, %s",$1,$2,$4,$6,$8); } ; tipo : CHAR { strcpy($$,"char"); } | INT { strcpy($$, "int"); } ; not_null : { strcpy($$, " "); } | NOT_NULL { strcpy($$, " not null"); } ; %% /* funciones auxiliares */ #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include </usr/include/sys/stat.h> #include </usr/include/sys/types.h> #include "utiles.c" #include "select.c" #include "insert.c" #include "delete.c" #include "update.c" extern int yylex(); /* Liga con la funcion yylex generada por LEX */ extern int yynerrs; int yyparse(); void main(int argc, char *argv[]) { system("clear"); printf("\n"); filtros = NULL; field_req = NULL; campos = NULL, read_struct(argv[1]); printf("-------------------------------------------\n"); printf(" Monitor SQL - DBF\n"); printf("-------------------------------------------\n"); printf(":-) "); yyparse(); printf("\n:-)~ok\n"); } yyerror() /* llamado por yyparse() cuando ocurra */ { /* un error */ printf("\n error de sintaxis \n"); return 1; }