Calculadora
Calculadora
Especificación Léxica
TKN_NUM [0-9]+("."[0-9]+)?
TKN_ASIGN "="
TKN_PTOCOMA ";"
TKN_ID [a-zA-z][a-zA-Z0-9]*
TKN_MULT "*"
TKN_DIV "/"
TKN_MAS "+"
TKN_MENOS "-"
TKN_PAA "("
TKN_PAC ")"
TKN_SEN "sen"
TKN_COS "cos"
Especificación Sintáctica
El lenguaje a reconocer viene definido por la siguiente gramática:
Calculadora id = Expresion ;
Expresion num |
Expresion + Expresion | Expresion - Expresion |
Expresion * Expresion | Expresion / Expresion |
( Expresion ) | sen ( Expresion ) | cos ( Expresion )
No olvidar establecer las precedencias y asociatividad de los operadores. Los
operadores suma + y resta – tienen igual prioridad y son asociativos por la izquierda.
Los operadores multiplicación * y división / son asociativos por la izquierda, tienen
igual prioridad entre sí y mayor que la de los anteriores.
Se pide:
Ejemplo
Ante la siguiente entrada
a =12+2*cos(3.14) ;
La salida debe ser:
El valor del identificador a es 10.
LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11
Fichero léxico_solo.l
%{
/* Ejemplo para una pequeña calculadora que permite
trabajar con numeros enteros y reales con las operaciones
básicas de suma, resta, producto, division y trigonometricas como el seno y el coseno */
#include <stdio.h>
#include <stdlib.h>
int nlines=0;
%}
DIGITO [0-9]
ID [a-zA-Z][a-zA-Z0-9_]*
%%
/* para compilar
flex lexico.l
cc lex.yy.c -o milex -lfl -lm
*/
Fichero léxico.l (versión a enlazar con Bison)
%{
/* Ejemplo para una pequeña calculadora que permite trabajar
con las operaciones básicas de suma, resta, producto, division y
trigonometricas como el seno y el coseno */
#include <stdio.h>
#include <stdlib.h>
#include "sintactico.tab.h"
int nlines=0;
%}
DIGITO [0-9]
ID [a-zA-Z][a-zA-Z0-9_]*
%%
%%
/********
Para el lexico solo
void main(int argc,char **argv)
{
if (argc>1)
yyin=fopen(argv[1],"rt");
else
yyin=stdin;
yylex();
printf("\nNumero lineas analizadas: %d\n", nlines);
}
*******/
/* para compilar
flex lexico.l
cc lex.yy.c -o milex -lfl -lm
*/
Fichero sintactico.y (Bison)
%{
/* Ejemplo para una pequeña calculadora que permite trabajar
con numeros enteros y reales con las operaciones básicas de
suma, resta, producto, division y trigonometricas como el seno y el coseno */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
extern int yylex(void);
extern char *yytext;
extern int nlines;
extern FILE *yyin;
void yyerror(char *s);
%}
%union
{
float real;
}
%start Calculadora
%type Calculadora
%type <real> Expresion
%%
yyparse();
return 0;
}
/* para compilar
bison -d sintactico.y
flex lexico.l
cc lex.yy.c sintactico.tab.c -o analizador -lfl -lm
*/