-
Notifications
You must be signed in to change notification settings - Fork 1
/
parser.y
87 lines (62 loc) · 1.93 KB
/
parser.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
%{
#include <stdio.h>
#include <stdlib.h>
extern FILE * yyin;
int yylex(); /* Declaración de yylex */
void yyerror(const char *s);
extern char *yytext;
%}
%token CTER PRINCIPAL CAMBIAR DEVOLVER TRADUCIR MIENTRAS CASO ROMPER MOSTRAR
%token IDENTIFICADOR CARACTER OPERADOR ASIGNACION FINSENTENCIA DELIMITADORIZQ DELIMITADORDER
%%
programa: PRINCIPAL DELIMITADORIZQ sentencias DELIMITADORDER;
sentencias: sentencia
| sentencia sentencias;
sentencia: inicio_sentencia
| inicio_sentencia FINSENTENCIA;
inicio_sentencia: mientras
| traducir
| cambiar
| caso
| declarar
| asignacion
| mostrar
| devolver;
mientras: MIENTRAS condicion DELIMITADORIZQ sentencias DELIMITADORDER;
condicion: IDENTIFICADOR OPERADOR CARACTER;
traducir: TRADUCIR IDENTIFICADOR;
cambiar: CAMBIAR IDENTIFICADOR DELIMITADORIZQ casos DELIMITADORDER;
casos: caso
| caso casos;
caso: CASO CARACTER FINSENTENCIA sentencias romper;
romper: ROMPER FINSENTENCIA;
declarar: CTER IDENTIFICADOR ASIGNACION CARACTER FINSENTENCIA
| CTER IDENTIFICADOR FINSENTENCIA;
asignacion: IDENTIFICADOR ASIGNACION CARACTER FINSENTENCIA;
mostrar: MOSTRAR CARACTER;
devolver: DEVOLVER IDENTIFICADOR FINSENTENCIA
| DEVOLVER CARACTER FINSENTENCIA;
%%
int main(int argc, char **argv) {
// Verifica si se pasó un archivo como argumento
if (argc < 2) {
fprintf(stderr, "Uso: %s <archivo>\n", argv[0]);
return 1;
}
yyin = fopen(argv[1], "r");
if (!yyin) {
perror("Error al abrir el archivo");
return 1;
}
if (yyparse() == 0) { // 0 significa éxito en la parsificación
printf("¡Buen fin! El archivo se ha procesado correctamente.\n");
} else {
printf("Hubo un error de sintaxis en el archivo.\n");
}
fclose(yyin);
return 0;
}
void yyerror(const char *s) {
//fprintf(stderr, "Error: %s\n", s);
fprintf(stderr, "Error: %s, en '%s'\n", s, yytext);
}