TECNOLÓGICO NACIONAL DE MÉXICO
Instituto Tecnológico de Lázaro Cárdenas
Instituto Tecnológico de Lázaro Cárdenas
Trabajo:
Proyecto
Materia:
Lenguajes y Autómatas 2
Integrantes:
Dayana Brissel Leal Talavera
Número de control: 14560753
Gerardo Valente Sánchez
Número de control: 14560508
Michel Amauri González Ruiz
Número de control: 14560454
Profesor:
Ing. Marcelo Alonso Mondragón
Cd. y Puerto de Lázaro Cárdenas Mich.
Av. Melchor Ocampo # 2555, Col. Cuarto Sector, C.P. 60950, Cd. Lázaro Cárdenas, Michoacán
Teléfono (753) 53 7 19 77, 53 2 10 40, 53 7 53 91, 53 7 53 92 Dirección Ext. 109, Fax. 108
e-mail: direccion@[Link] Internet: [Link].
1. Diseñar y crear un lenguaje de programación
2. Asignar un nombre al lenguaje y explicar su propósito.
Nombre: Lag++
Propósito:
El propósito de este lenguaje de programación será calcular las siguientes
conversiones de temperaturas:
Celsius a Fahrenheit
Fahrenheit a Celsius
Kelvin a Celsius
Celsius a Kelvin
Fahrenheit a Kelvin
Kelvin a Fahrenheit
3. Describir el funcionamiento del lenguaje, incluyendo una descripción
textual de los comandos a utilizar.
Este lenguaje funcionara de la siguiente manera:
Se tomarán dos operadores donde el primer operador definirá la temperatura que
se dará y el segundo a la que se hará la conversión, después se establecerá el
operando que tendrá que ir en medio de los operadores, el cual será la temperatura
que se convertirá, deberá ser un numero entero ya sea negativo o positivo.
4. Definir la estructura general de un programa para el lenguaje de
programación definido
Estructura:
Operador Operando Operador
5.- Poner ejemplos de como serian los programas usando el lenguaje de
programación.
C 12 F
Resultado = 53.6
K3F
Resultado = - 454.27
6.- Identificar las unidades de léxico utilizadas en el lenguaje
Palabras reservadas: C, F, K
NúmEnteros D+ (D= 0-9)
7.- Elaborar el analizador léxico
Entrada:
Código del Analizador léxico (LEX).
%option noyywrap
%option yylineno
%{
#include "lagyac.h"
%}
D "-"?[0-9]
TC c|C
TF f|F
TK k|K
T [ \t]
%%
{D}+ {printf ("Numero: %s \n", yytext); [Link]=atoi(yytext); return
NUM;}
{TC} {printf ("Temperatura en Grados Celsius: %s \n",yytext);
strcpy([Link],yytext); return TC;}
{TF} {printf ("Temperatura en Grados Fagrenheit: %s \n",yytext);
strcpy([Link],yytext); return TF;}
{TK} {printf ("Temperatura en Grados Kelvin: %s \n",yytext);
strcpy([Link],yytext); return TK;}
{T}
. {printf ("Linea %d: Caracter invalido: %s \n",yylineno,yytext);}
%%
Resultado
8.- Analizador Sintáctico
Código Analizador sintáctico (YACC)
%{
extern int yylineno;
void temps(char l[], int a, char g[]);
%}
%union {
int numero;
char cadena[2];
}
%token NUM TC TF TK
%type <numero> NUM
%type <cadena> TC TF TK Y Z
%start D
%%
D:DX
;
D:X
;
X : Z NUM Y { printf("Linea %d: Sentencia Valida - %s %d %s \n",
yylineno,$1,$2,$3);
temps($1,$2,$3); }
;
X : error
;
Z : TF
| TK
| TC
;
Y : TC
| TF
| TK
;
Resultados:
Ejemplo:
9.- Analizador Semántico
Código Analizador Semántico (LEX)
%option noyywrap
%option yylineno
%{
#include "lagyac.h"
%}
D "-"?[0-9]
TC c|C
TF f|F
Código Analizador Semántico (LEX)
TK k|K
T [ \t]
%%
{D}+ { [Link]=atoi(yytext); return NUM;}
{TC} { strcpy([Link],yytext); return TC;}
{TF} { strcpy([Link],yytext); return TF;}
{TK} { strcpy([Link],yytext); return TK;}
{T}
. {printf ("Linea %d: Caracter invalido: %s \n",yylineno,yytext);}
%%
Codigo Analizador Semántico (YACC)
%{
extern int yylineno;
void temps(char l[], int a, char g[]);
%}
%union {
int numero;
char cadena[2];
}
%token NUM TC TF TK
%type <numero> NUM
%type <cadena> TC TF TK Y Z
%start D
%%
D:DX
;
D:X
;
X : Z NUM Y { printf("Linea %d: Sentencia Valida - %s %d %s \n", yylineno,$1,$2,$3);
temps($1,$2,$3); }
;
X : error
;
Z : TF
| TK
| TC
;
Y : TC
| TF
| TK
;
%%
main ()
{
yyparse();
}
yyerror(char *s)
{
printf("Linea %d: Error de sintaxis(%s) \n",yylineno,s);
}
void temps(char l[], int a, char g[])
{
float temp=0;
if ( (strcmp("c",l)==0) && (strcmp("k",g)==0) ) {
temp = a + 273.15;
printf("%d Celcius equivale a %.2f Kelvins \n",a,temp);
}
if ( (strcmp("k",l)==0) && (strcmp("c",g)==0) ) {
temp = a - 273.15;
printf("%d Kelvins equivale a %.2f Celcius \n",a,temp);
}
if ( (strcmp("f",l)==0) && (strcmp("c",g)==0) ) {
temp = (a - 32) * 0.5555;
printf("%d Fahrenheits equivale a %.2f Celcius \n",a,temp);
}
if ( (strcmp("c",l)==0) && (strcmp("f",g)==0) ) {
temp = (a * 0.5555) + 32;
printf("%d Celcius equivale a %.2f Fahrenheits \n",a,temp);
}
if ( (strcmp("k",l)==0) && (strcmp("f",g)==0) ) {
temp = (0.5555 * (a - 273.15)) + 32;
printf("%d Kelvins equivale a %.2f Fahrenheits \n",a,temp);
}
if ( (strcmp("f",l)==0) && (strcmp("k",g)==0) ) {
temp = (0.5555 * (a - 32)) + 273.15;
printf("%d Fahrenheits equivale a %.2f Kelvins \n",a,temp);
}
}
Ejemplo
Archivo Generado (.h)
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
enum yytokentype {
NUM = 258,
TC = 259,
TF = 260,
TK = 261
};
#endif
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
#line 5 "lagyac.y"
int numero;
char cadena[2];
#line 65 "lagyac.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE
# define YYSTYPE_IS_DECLARED 1
#endif
extern YYSTYPE yylval;