-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser - Copy.y
139 lines (107 loc) · 2.55 KB
/
parser - Copy.y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
%{
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern FILE *yyin;
extern void yyerror(char *s);
extern int lineas;
extern int cantvariables;
extern struct variable{
int valor;
char* nombre;
} variables[20];
int agregarValorId(char*, int);
int obtenerValorDeTabla(char*);
%}
%union{
int entero;
char* nombre;
}
%token <entero> CONSTANTE
%token <nombre> IDENTIFICADOR
%token <nombre>MAS
%token <nombre>MENOS
%token <nombre>ASIGNACION
%token <nombre>PARENTESIS_IZQUIERDO
%token <nombre>PARENTESIS_DERECHO
%token <nombre>PUNTOYCOMA
%token <nombre>COMA
%token <nombre>SALTO
%token <nombre>INICIO
%token <nombre>ESCRIBIR
%token <nombre>LEER
%token <nombre>FIN
%left ASIGNACION
%left MAS
%left MENOS
%type <entero> Expresion
%type <entero> Asignacion
%type <entero> Variable
%start Programa
%%
Programa: INICIO ListaDeSentencias FIN
;
ListaDeSentencias: Sentencia PUNTOYCOMA
| Sentencia PUNTOYCOMA ListaDeSentencias
;
Sentencia: Asignacion
| Lectura
| Escritura
;
ListaDeIdentificadores: IDENTIFICADOR
| ListaDeIdentificadores COMA IDENTIFICADOR
;
ListaDeExpresiones: Expresion
| ListaDeExpresiones COMA Expresion
;
Expresion: Variable { $$= $1;}
| CONSTANTE { $$= $1; }
| Expresion MAS Expresion { $$=$1 + $3;}
| Expresion MENOS Expresion { $$=$1 - $3;}
| MENOS Expresion { $$=-$2; }
| PARENTESIS_IZQUIERDO Expresion PARENTESIS_DERECHO { $$=$2; }
;
Variable: IDENTIFICADOR {$$ = obtenerValorDeTabla($1);}
;
Asignacion: IDENTIFICADOR ASIGNACION Expresion {$$ = agregarValorId($1,$3); }
;
Lectura: LEER PARENTESIS_IZQUIERDO ListaDeIdentificadores PARENTESIS_DERECHO
;
Escritura: ESCRIBIR PARENTESIS_IZQUIERDO ListaDeExpresiones PARENTESIS_DERECHO
;
%%
void yyerror(char *s)
{
printf("Error sintactico %s \n",s);
}
int main(int argc, char **argv)
{
if(argc>1)
yyin=fopen(argv[1], "rt");
else
yyin=stdin;
yyparse();
printf("Fin del analisis sintactico. \n");
printf("Numero de lineas analizadas: %d \n", lineas);
return 0;
}
int obtenerValorDeTabla(char* nombre){
int i;
for(i=0; i< cantvariables; i++){
if(strcmp(variables[i].nombre, nombre)){
return variables[i].valor;
}
}
return 0;
}
int agregarValorId(char* nombre, int valor){
int i;
for(i=0; i< cantvariables; i++){
if(strcmp(variables[i].nombre,nombre)){
variables[i].valor = valor;
return valor;
}
}
exit(0);
}