| INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE CÓMPUTO |

Introducción | Contenido | Bibliografía

Introducción
Contenido
UNIDAD I
UNIDAD II
UNIDAD III
UNIDAD IV
UNIDAD V Introducción 5.1 Estructura de un programa en YACC 5.2 Definición del tipo de la pila de YACC 5.3 Terminales y no terminales en YACC

5.4 Precedencia y asociatividad en YACC

5.5 Manejo de Errores en YACC

5.6 Desarrollo de una aplicación utilizando LEX y YACC

UNIDAD VI
UNIDAD VII
UNIDAD VIII
UNIDAD IX
PROBLEMARIO
Bibliografía

5.6 Desarrollo de una aplicación utilizando LEX y JACC

> Una pequeña calculadora de escritorio

> Este ejemplo da la especificación completa de yacc para una pequeña calculadora de escritorio: La calculadora de escritorio tiene 26 registros, marcados a hasta z, y acepta expresiones aritméticas formadas de los operadores +, -, *, /, % (operador mod), & (and), | (or), y la asignación. Si una expresión a nivel superior es una asignación, el valor no se imprime; en caso contrario se imprime. Como en C, se asume que un entero que comienza con 0 (cero) es un número octal, en caso contrario, se asume que es decimal.

> Como ejemplo de una especificación del yacc, la calculadora de escritorio hace el trabajo de mostrar como se usan las precedencias y las ambigüedades y demuestra una recuperación de error sencilla. Las mayores sobre simplificaciones son que la fase de análisis léxico es mucho más sencilla que para la mayoría de las aplicaciones, y se produce la salida inmediatamente línea a línea. Nótese la forma en que se leen los enteros decimales y octales en las reglas gramaticales; este trabajo se hace probablemente mejor por medio del analizador léxico.

> %{
> #include <stdio.h>
> #include <ctype.h>
> int regs[26]
> int base;
> %}
> %start list
> %token DIGIT LETTER
> %left ‘|’
> %left ‘&’
> %left ‘+’ ‘-‘
> %left ‘*’ ‘/’ ‘%’
> %left UMINUS /* Precedencia para el signo menos unitario */
> %% /* Comienzo de la sección de reglas */
> list : /* vacía */
> | list stat ‘\n’
> | list error ‘\n’
> yyerrok;
> ;
> stat : expr
> { printf(“%d\n”,$1); }
> | LETTER ‘=’ expr
> { regs[$1] = $3; }
> ;
> expr : ‘(‘ expr ‘)’
> { $$ = $2 ;}
> | expr ‘+’ expr
> { $$ = $1 + $3; }
> | expr ‘-’ expr
> { $$ = $1 - $3; }
> | expr ‘*’ expr
> { $$ = $1 * $3; }
> | expr ‘/’ expr
> { $$ = $1 / $3; }
> | expr ‘%’ expr
> { $$ = $1 % $3; }
> | expr ‘&’ expr
> { $$ = $1 & $3; }
> | expr ‘|’ expr
> { $$ = $1 | $3; }
> | ‘-’ expr %prec UMINUS
> { $$ = - $2; }
> | LETTER
> { $$ = regs [$1];}
> | number
> ;
> number: DIGIT
> {$$ = $1; base = ( $1 == 0) ? 8 : 10;}
> | number DIGIT
> { $$ = base * $1 + $2;}
> ;
> %% /* inicio de los programas */
> yylex() /* rutina de análisis léxico*/
> /* devuelve LETTER por una letra minúscula */
> /* yylval = 0 hasta 25 */
> /* devuelve DIGIT por un dígito */
> /* yylval = 0 hasta 9 */
> /* todos los otros caractreres */
> /* se devuelven inmediatamente */
> int c;
> while ( (c=getchar()) == ‘ ’)
> {/* salta espacios en blanco */}
> /* c ahora no es un espacio en blanco */
> if( islower ( c ) ) {
> yylval = c - ‘a’;
> return ( LETTER );
> }
> if( isdigit ( c ) ) {
> yylval = c - ‘0';
> return ( DIGIT );
> }
> return ( c )
> }

> Atrás Siguiente

##### Introducción / Contenido / Unidad I / Unidad II / Unidad III / Unidad IV / Unidad V / Unidad VI / Unidad VII / Unidad VIII / Unidad IX / Problemario / Bibliografía

##### Inicio

##### Créditos

José Sánchez Juárez, Andrés Ortigoza Campos, Fabiola Ocampo Botello