Você está na página 1de 8

ANALIZADOR LEXICO Y SINTACTICO JUNTOS

Codigo fuente del lexico.L


%{
#include <stdio.h>
#include <conio.h>
#include "parser.h"
%}
%option noyywrap
%option yylineno
letra [a-zA-Z]
digito [0-9]
binario [0-1]
ignora " "|\t|\n
operarit *|+|-|/
operlog &|$
comparador <|>|<=|>=|==|!=
%%
{ignora}+ {;}
"Entero" {printf("Palabra reservada para tipo de
dato entero\n");return PRENTERO;}
"Real" {printf("Palabra reservada para tipo de
dato real\n");return PRREAL;}
"Booleano" {printf("Palabra reservada para tipo de
dato booleano\n");return PRBOOLEANO;}
"Caracter" {printf("Palabra reservada para tipo de
dato caracter\n");return PRCARACTER;}
"Si" {printf("Palabra reservada para
condicional\n");return PRSI;}
"Sino" {printf("Palabra reservada para otro
condicional\n");return PRSINO;}
"SinoSi" {printf("Palabra reservada para definir
condicionales secundarias\n");return PRSINOSI;}
"Entonces" {printf("Palabra reservada para definir
accion a realizar\n");return PRENTONCES;}
"FinSi" {printf("Palabra reservada finalizar
condicional\n");return PRFINSI;}
"Para" {printf("Palabra reservada para bucle de
tipo Para\n");return PRPARA;}
"FinPara" {printf("Palabra reservada para fin de
bucle de tipo Para\n");return PRFINPARA;}
"Mientras" {printf("Palabra reservada para bucle de
tipo Mientras\n");return PRMIENTRAS;}
"Hacer" {printf("Palabra reservada para indicar
que se empieza algo\n");return PRHACER;}
"FinMientras" {printf("Palabra reservada fin de bucle
de tipo Mientras\n");return PRFINMIENTRAS;}
"FinHacerMientras" {printf("Palabra reservada para indicar
fin de bucle Hacer-Mientras\n");return PRFINHACERMIENTRAS;}
"Funcion" {printf("Palabra reservada para
declaracion de funciones\n");return PRFUNCION;}
"Estructura" {printf("Palabra reservada para
declaracion de estructuras\n");return PRESTRUCTURA;}
"FinFuncion" {printf("Palabra reservada para finalizar
funcion\n");return PRFINFUNCION;}
"Retorna" {printf("Palabra reservada para retorno
de funcion\n");return PRRETORNA;}
"SinValor" {printf("Palabra reservada para funcion
sin valor de retorno\n");return PRSINVALOR;}
"Definir" {printf("Palabra reservada para definir
funciones\n");return PRDEFINIR;}
"Constante" {printf("Palabra reservada para definir
constantes\n");return PRCONSTANTE;}
"Entrada" {printf("Palabra reservada para definir
entradas\n");return PRENTRADA;}
"Salida" {printf("Palabra reservada para definir
salidas\n");return PRSALIDA;}
{letra}({letra}|{digito})* {printf("Identificador\n");return IDENT;}
{letra}+ {printf("Caracter\n");return CARACTER;}
{binario}+ {printf("Binario\n");return BOOLEANO;}
{digito}+ {printf("Entero\n");return ENTERO;}
{digito}+"."{digito}+ {printf("Real\n");return REAL;}
{comparador} {printf("Comparador\n");return
COMPARADOR;}
":=" {printf("Asignador\n");return ASIG;}
";" {printf("Fin sentencia\n");return PCOMA;}
"!=" {printf("Diferente\n");return DIF;}
"," {printf("Coma\n");return COMA;}
"==" {printf("Igual\n");return IGUAL;}
"." {printf("Punto\n");return PTO;}
">=" {printf("Signo mayor-igual\n");return
MAIGU;}
"<=" {printf("Signo menor-igual\n");return
MEIGU;}
"(" {printf("(\n");return PARIZ;}
")" {printf(")\n");return PARDE;}
">" {printf(">\n");return MAYOR;}
"<" {printf("<\n");return MENOR;}
"{" {printf("{\n");return LLIZ;}
"}" {printf("}\n");return LLDE;}
"+" {printf("+\n");return MAS;}
"-" {printf("-\n");return MENOS;}
"*" {printf("*\n");return POR;}
"/" {printf("/\n");return ENTRE;}
"&" {printf("&\n");return YLOG;}
"$" {printf("Operador Logico\n");return
OLOG;}
. {printf("ERROR LEXICO EN LINEA %d
\n",yylineno);}
%%
int main(int argc,char *argv[])
{
if ((yyin = fopen(argv[1], "rt")) == NULL)
{
printf("\nNo se puede abrir el archivo: %s\n", argv[1]);
}
else
{
//yylex();
yyparse();
}
fclose(yyin);
return 0;
}
Codigo fuente de sintactico.y

%{
int yystopparser=0;
%}

%token PRENTERO PRREAL PRBOOLEANO PRCARACTER PRSI PRSINO PRSINOSI


PRENTONCES PRFINSI PRPARA
PRFINPARA PRMIENTRAS PRHACER PRFINMIENTRAS PRFINHACERMIENTRAS
PRFUNCION PRFINFUNCION PRRETORNA PRSINVALOR PRESTRUCTURA MAS MENOS POR
ENTRE OLOG YLOG
PRDEFINIR PRCONSTANTE IDENT ENTERO REAL BOOLEANO CARACTER COMPARADOR
ASIG PCOMA DIF COMA IGUAL PTO
MAIGU MEIGU PARIZ PARDE MAYOR MENOR LLIZ LLDE PRSALIDA PRENTRADA
%start inicio

%%
inicio : funcion | constante | estructura;

estructura : PRESTRUCTURA IDENT LLIZ n;


n : declaracion n | declaracion nn ;
nn : LLDE IDENT PCOMA o ;
o : estructura | constante | funcion;

constante : PRDEFINIR PRCONSTANTE e ;


e : PRENTERO IDENT f | PRREAL IDENT f | PRBOOLEANO IDENT f;
f : ASIG g;
g : ENTERO PCOMA y | REAL PCOMA y | BOOLEANO PCOMA y;
y : constante | estructura | funcion;

funcion : PRFUNCION j;
j : PRENTERO k | PRREAL k | PRBOOLEANO k | PRCARACTER k |
PRSINVALOR k;
k : IDENT PARIZ l;
l : kl;
kl : declaracion l | ll;
ll : PARDE sentencia m;
m : PRRETORNA IDENT p | p;
p : PRFINFUNCION funcion | PRFINFUNCION;

comparacion : IDENT COMPARADOR b;


b : IDENT | REAL | ENTERO | BOOLEANO;

declaracion : PRENTERO c | PRREAL c | PRBOOLEANO c | PRCARACTER c


c : IDENT PCOMA
;

asignacion : IDENT ASIG a


a : IDENT PCOMA | ENTERO PCOMA | REAL PCOMA | BOOLEANO PCOMA |
oparitmetica PCOMA
;

mientras : PRMIENTRAS PARIZ x


x : comparacion y | oplogica y
y : PARDE sentencia PRFINMIENTRAS
;
hacermientras : PRHACER sentencia PRFINHACERMIENTRAS PRMIENTRAS PARIZ
cc
cc : comparacion PARDE | oplogica PARDE
;

para : PRPARA PARIZ asignacion comparacion PCOMA asignacion PARIZ


sentencia PRFINPARA
;

si : PRSI PARIZ sh
sh : comparacion shh | oplogica shh
shh : PARDE PRENTONCES sentencia h
h : PRFINSI | PRSINOSI PARIZ comparacion PARDE PRENTONCES sentencia
i
i : h | z
z : PRSINO PRENTONCES sentencia PRFINSI
;

sentencia : declaracion sentencia | declaracion | asignacion


sentencia | asignacion | mientras sentencia | mientras |
hacermientras sentencia | hacermientras | para sentencia | para |
si sentencia | si | entrada sentencia | entrada | salida
sentencia | salida
;

salida : PRSALIDA ASIG LLIZ LLDE PCOMA


;

entrada : PRENTRADA IDENT PCOMA


;

oparitmetica : MAS PARIZ q | POR PARIZ q | suma | producto


q : oparitmetica PARDE r
suma : MAS r t
producto : POR r t
t : r u
u : t |
r : IDENT | REAL | ENTERO
;

oplogica : OLOG PARIZ qq | YLOG PARIZ qq | yy | oo


qq : oplogica PARDE rr
oo : OLOG rr tt
yy : YLOG rr tt
tt : rr uu
uu : tt |
rr : comparacion
;
Codigo parser.h
#ifndef YYSTYPE
#define YYSTYPE int
#endif
#define PRENTERO 257
#define PRREAL 258
#define PRBOOLEANO 259
#define PRCARACTER 260
#define PRSI 261
#define PRSINO 262
#define PRSINOSI 263
#define PRENTONCES 264
#define PRFINSI 265
#define PRPARA 266
#define PRFINPARA 267
#define PRMIENTRAS 268
#define PRHACER 269
#define PRFINMIENTRAS 270
#define PRFINHACERMIENTRAS 271
#define PRFUNCION 272
#define PRFINFUNCION 273
#define PRRETORNA 274
#define PRSINVALOR 275
#define PRESTRUCTURA 276
#define MAS 277
#define MENOS 278
#define POR 279
#define ENTRE 280
#define OLOG 281
#define YLOG 282
#define PRDEFINIR 283
#define PRCONSTANTE 284
#define IDENT 285
#define ENTERO 286
#define REAL 287
#define BOOLEANO 288
#define CARACTER 289
#define COMPARADOR 290
#define ASIG 291
#define PCOMA 292
#define DIF 293
#define COMA 294
#define IGUAL 295
#define PTO 296
#define MAIGU 297
#define MEIGU 298
#define PARIZ 299
#define PARDE 300
#define MAYOR 301
#define MENOR 302
#define LLIZ 303
#define LLDE 304
#define PRSALIDA 305
#define PRENTRADA 306
extern YYSTYPE yylval;
codigo error.c
void yyerror(char * msg)
{
printf ("%s\n", msg);
}

Se instala el flex y bison.

Ahora ya capturados los codigos se compila el lexico.l y el sintactico.y de la siguiente manera:

Al compilar se generan 3 archivos los cueles son lex.y y, y.tab.c , y.tab.h


Ahora ya casi esta listo solo nos queda utilizar dev-c++ para generar el ejecutable.

Solo queda agregar todos los archivos al dev en un nuevo proyecto y posteriormente
compilarlo.

Por ultimo hacer una prueba con el siguiente codigo.

Codigo00.shark
Estructura est
{
Entero num;
Entero nfgj;
Booleano ggnum;
} est1;

Definir Constante Entero numero := 145 ;

Funcion Entero miFuncion( Caracter Cadena; )

Car:=Carro;
Entero Num;

Mientras ( c<d )

Car:=Carro;
Entero bandera;
Booleano boole;
boole:=1;

Mientras ( a>=4 )

Car:=Carro;
Entero bandera;
Booleano boole;
boole:=1;

Para ( a:=14; a<=25; a:= + 5 4 ;(


Si ( a==4 ) Entonces
Bool:=1;
FinSi

FinPara

FinMientras

FinMientras

Si ( a==4 ) Entonces
Bool:=1;
FinSi

Retorna Numero

FinFuncion

Para hacer la prueba solo nos queda ejecutarlo por medio del cmd entrar a la carpeta en
donde se encuentra el exa.exe y posteriormente teclear exa.exe codigo00.shark.

Araceli Reyes Balcázar

Hernando Olmedo Molina

Você também pode gostar