Skip to content
Snippets Groups Projects
Commit 53f2b772 authored by albruiz's avatar albruiz
Browse files

cambios realizados sobre la declaracion de variables

parent 5a46fb62
Branches
No related tags found
No related merge requests found
Makefile 100644 → 100755
...@@ -4,12 +4,30 @@ ...@@ -4,12 +4,30 @@
#include<ctype.h> #include<ctype.h>
#include<math.h> #include<math.h>
void poper(char); #define NUM_VARIABLES 100
typedef struct Par{
char *clave;
double numerico;
char caracter;
char cadena[1000];
int logico;
};
void declara(char*);
void setNumerico(char,double);
void setCaracter(char,char);
void setCadena(char,char*);
void setLogico(char,int);
double getNumerico(char*);
char getCaracter(char*);
char* getCadena(char*);
int getLogico(char*);
int yyerror(char const *); int yyerror(char const *);
int yylex(void); int yylex(void);
extern int pos; extern int pos;
Par variables[NUM_VARIABLES];
int num_variable = 0;
%} %}
%union { %union {
...@@ -41,7 +59,7 @@ extern int pos; ...@@ -41,7 +59,7 @@ extern int pos;
%token MCD %token MCD
%token LOG %token LOG
%token CADENACARAC %token CADENACARAC
%token<cadenaReservada> NOMBRE
%type<real> expresionNumerica %type<real> expresionNumerica
%type<logico> expresionLogica %type<logico> expresionLogica
...@@ -49,6 +67,7 @@ extern int pos; ...@@ -49,6 +67,7 @@ extern int pos;
%type<cadenaReservada> expresionCadena %type<cadenaReservada> expresionCadena
%left '+' '-' %left '+' '-'
%left '*' '/' %left '*' '/'
%right '^' %right '^'
...@@ -64,29 +83,28 @@ sentencia: ...@@ -64,29 +83,28 @@ sentencia:
| sentenciaBloque | sentenciaBloque
; ;
sentenciaSimple: sentenciaSimple:
declaracion declaracion ';'
| asignacion | asignacion ';'
| condicional | condicional ';'
| bucle | bucle ';'
| metodo | metodo ';'
;
metodo:
PRINTF '(' expresionCadena ')' {printf("%s",$3) ; }
| SCANF '(' expresionCadena ')' {scanf("%s", $3) ; }
; ;
sentenciaBloque: sentenciaBloque:
sentenciaSimple ';' sentenciaBloque sentenciaSimple sentenciaBloque
| sentenciaSimple ';' | sentenciaSimple
; ;
declaracion: declaracion:
VAR CADENA { VAR expresionCadena {declara($2);}
int $2_bool;
double $2_num;
char $2_car;
char $2_cad[1000];
}
; ;
asignacion: asignacion:
variable '=' expresionLogica {$1_bool = $3;} variable '=' expresionLogica {setLogico($1,$3);}
| variable '=' expresionNumerica {$1_num = $3;} | variable '=' expresionNumerica {setNumerico($1,$3);}
| variable '=' expresionCaracter {$1_car = $3;} | variable '=' expresionCaracter {setCara($1,$3);}
| variable '=' expresionCadena {strcpy($1_cad, $3);} | variable '=' expresionCadena {setCadena($1, $3);}
; ;
condicional: condicional:
condicionalSimple condicionalSimple
...@@ -109,7 +127,7 @@ bucleHazMientras: ...@@ -109,7 +127,7 @@ bucleHazMientras:
DO sentencia WHILE '(' expresionLogica ')' {do $2 while($5)} DO sentencia WHILE '(' expresionLogica ')' {do $2 while($5)}
; ;
expresionNumerica: expresionNumerica:
funcionNumerica {$$ = $1} funcionNumerica {$$ = $1 ;}
| '-' expresionNumerica {$$ = (-1)*$2; } | '-' expresionNumerica {$$ = (-1)*$2; }
| expresionNumerica '+' expresionNumerica {$$ = $1 + $3 ; } | expresionNumerica '+' expresionNumerica {$$ = $1 + $3 ; }
| expresionNumerica '-' expresionNumerica {$$ = $1 - $3 ; } | expresionNumerica '-' expresionNumerica {$$ = $1 - $3 ; }
...@@ -118,21 +136,30 @@ expresionNumerica: ...@@ -118,21 +136,30 @@ expresionNumerica:
| expresionNumerica '^' expresionNumerica {$$ = pow($1,$3) ; } | expresionNumerica '^' expresionNumerica {$$ = pow($1,$3) ; }
| '(' expresionNumerica ')' {$$ = $2 ;} | '(' expresionNumerica ')' {$$ = $2 ;}
| DIGITO {$$ = $1 ;} | DIGITO {$$ = $1 ;}
| variable {$$ = getNumerico($1);}
; ;
expresionLogica: expresionLogica:
'!'expresionLogica {$$ = !$2;} '!'expresionLogica {$$ = !$2;}
| expresionLogica '|' expresionLogica {$$ = $1 | $3 ; } | expresionLogica '|' expresionLogica {$$ = $1 | $3 ; }
| expresionLogica '&' expresionLogica {$$ = $1 & $3 ; } | expresionLogica '&' expresionLogica {$$ = $1 & $3 ; }
| expresionLogica '>' expresionLogica {$$ = $1 > $3 ; }
| expresionLogica '>=' expresionLogica {$$ = $1 >= $3 ; }
| expresionNumerica '<' expresionNumerica {$$ = $1 < $3 ; } | expresionNumerica '<' expresionNumerica {$$ = $1 < $3 ; }
| expresionNumerica '<=' expresionNumerica {$$ = $1 <= $3 ; }
| expresionCaracter '<' expresionCaracter {$$ = $1 < $3 ; } | expresionCaracter '<' expresionCaracter {$$ = $1 < $3 ; }
| expresionCaracter '<=' expresionCaracter {$$ = $1 <= $3 ; } | expresionNumerica '<''=' expresionNumerica {$$ = $1 <= $4 ; }
| expresion '==' expresion {$$ = $1 == $3 ; } | expresionCaracter '<''=' expresionCaracter {$$ = $1 <= $4 ; }
| expresion '!=' expresion {$$ = $1 != $3 ; } | expresionNumerica '>''=' expresionNumerica {$$ = $1 >= $4 ; }
| expresionCaracter '>''=' expresionCaracter {$$ = $1 >= $4 ; }
| expresionNumerica '>' expresionNumerica {$$ = $1 > $3 ; }
| expresionCaracter '>' expresionCaracter {$$ = $1 > $3 ; }
| expresionLogica '=''=' expresionLogica {$$ = $1 == $4 ; }
| expresionNumerica '=''=' expresionNumerica {$$ = $1 == $4 ; }
| expresionCaracter '=''=' expresionCaracter {$$ = $1 == $4 ; }
| expresionLogica '!''=' expresionLogica {$$ = $1 != $4 ; }
| expresionNumerica '!''=' expresionNumerica {$$ = $1 != $4 ; }
| expresionCaracter '!''=' expresionCaracter {$$ = $1 != $4 ; }
| '(' expresionLogica ')' {$$ = $2 ;} | '(' expresionLogica ')' {$$ = $2 ;}
| BOOLEANO {$$ = $1 ;} | BOOLEANO {$$ = $1 ;}
| variable {$$ = getLogico($1);}
; ;
expresionCaracter: expresionCaracter:
expresionCaracter '+' expresionCaracter {$$ = $1 + $3 ; } expresionCaracter '+' expresionCaracter {$$ = $1 + $3 ; }
...@@ -141,6 +168,13 @@ expresionCaracter: ...@@ -141,6 +168,13 @@ expresionCaracter:
| expresionCaracter '/' expresionCaracter {$$ = $1 / $3 ; } | expresionCaracter '/' expresionCaracter {$$ = $1 / $3 ; }
| '(' expresionCaracter ')' {$$ = $2 ;} | '(' expresionCaracter ')' {$$ = $2 ;}
| CARACTER {$$ = $1 ;} | CARACTER {$$ = $1 ;}
| variable {$$ = getCaracter($1);}
;
expresionCadena:
expresionCaracter expresionCadena {$$ = $1 + $2}
| "" {$$ = $1}
| variable {$$ = getCadena($1);}
; ;
funcionNumerica: funcionNumerica:
SIN '(' expresionNumerica ')' {$$ = sin($3) ; } SIN '(' expresionNumerica ')' {$$ = sin($3) ; }
...@@ -151,21 +185,104 @@ funcionNumerica: ...@@ -151,21 +185,104 @@ funcionNumerica:
| ARCTG '(' expresionNumerica ')' {$$ = atan($3); } | ARCTG '(' expresionNumerica ')' {$$ = atan($3); }
| LOG '('expresionNumerica ',' expresionNumerica ')' {$$ = log10($5) / log10($3); } | LOG '('expresionNumerica ',' expresionNumerica ')' {$$ = log10($5) / log10($3); }
; ;
variable:
NOMBRE {$$ = $1;}
;
%%
cadena:
'"' CADENACARAC '"' {$$ = "$2"}
| '"' CADENACARAC '"' ','
|
imprimir:
PRINTF '(' cadena ')'
;
// Funcion que permite declarar variables
void declara(char *clave){
int i;
for (i = 0; i < num_variable; i++){
if(strcmp(variables[i].clave,clave) == 0){
return
}
}
variables[num_variable].clave = clave;
num_variable++;
}
// Dar el valor numerico a la variable numerica
void setNumerico(char *clave, double valor){
int i;
for (i = 0; i < num_variable; i++){
if(strcmp(variables[i].clave,clave) == 0){
variable.numerico = valor;
}
}
}
%% // Dar el valor caracter a la variable caracter
void setCaracter(char *clave, double valor){
int i;
for (i = 0; i < num_variable; i++){
if(strcmp(variables[i].clave,clave) == 0){
variable.caracter = valor;
}
}
}
void poper(char c){ // Dar el valor cadena a la variable cadena
void setCadena(char *clave, char *valor){
int i;
for (i = 0; i < num_variable; i++){
if(strcmp(variables[i].clave,clave) == 0){
variable.cadena = *valor;
}
}
}
// Dar el valor logico a la variable logica
void setLogico(char *clave, int valor){
int i;
for (i = 0; i < num_variable; i++){
if(strcmp(variables[i].clave,clave) == 0){
variable.logico = logico;
}
}
}
double getNumerico(char *clave){
int i;
for(i = 0; i<num_variable;i++){
if(strcmp(variables.clave,clave) == 0){
return variables.numerico;
}
}
return NULL;
}
}
char getCaracter(char *clave){
int i;
for(i = 0; i<num_variable;i++){
if(strcmp(variables.clave,clave) == 0){
return variables.caracter;
}
}
return NULL;
}
char *getCadena(char *clave){
int i;
for(i = 0; i<num_variable;i++){
if(strcmp(variables.clave,clave) == 0){
return variables.cadena;
}
}
return NULL;
}
int getLogico(char *clave){
int i;
for(i = 0; i<num_variable;i++){
if(strcmp(variables.clave,clave) == 0){
return variables.logico;
}
}
return NULL;
}
/*void poper(char c){
switch(c){ switch(c){
case '+' : printf("<+> "); case '+' : printf("<+> ");
break; break;
...@@ -179,7 +296,7 @@ void poper(char c){ ...@@ -179,7 +296,7 @@ void poper(char c){
break; break;
} }
return; return;
} }*/
int yyerror(char const *s) int yyerror(char const *s)
{ {
......
%{ %{c
#include<stdio.h> #include<stdio.h>
#include"y.tab.h" #include"y.tab.h"
int pos = 0; int pos = 0;
...@@ -9,6 +9,10 @@ ...@@ -9,6 +9,10 @@
yylval.real = atof(yytext); yylval.real = atof(yytext);
return (DIGITO); return (DIGITO);
} }
([a-z]|[A-Z]|"_")+ {
strcpy(yyval.cadenaReservada,yytext);
return (NOMBRE);
}
true { true {
pos++; pos++;
yylval.logico = 1; yylval.logico = 1;
...@@ -19,16 +23,11 @@ false { ...@@ -19,16 +23,11 @@ false {
yylval.logico = 0; yylval.logico = 0;
return (BOOLEANO); return (BOOLEANO);
} }
\'.\' { . {
pos++; pos++;
yylval.caracter = yytext; yylval.caracter = yytext;
return (CARACTER); return (CARACTER);
} }
\".+\" {
pos++;
strcpy(yylval.cadenaReservada, yytext);
return (CADENA);
}
"if" { "if" {
pos++; pos++;
return (IF) return (IF)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment