Analizador léxico en C

8
I ESCUELA POLITECNICA NACIONAL INGENIERIA EN SISTEMAS INFORMATICOS Y DE COMPUTACIÓN Escuela Politécnica Nacional Ingeniería en Sistemas Informáticos y de Computación Analizador Léxico

Transcript of Analizador léxico en C

Page 1: Analizador léxico en C

I

ESCUELA POLITECNICA NACIONALINGENIERIA EN SISTEMAS INFORMATICOS Y DE COMPUTACIÓN

Escuela Politécnica Nacional

Ingeniería en Sistemas

Informáticos y de Computación

Analizador Léxico

Compiladores y Lenguajes

Bolaños Salazar Marco Alejandro

Page 2: Analizador léxico en C

II

ESCUELA POLITECNICA NACIONALINGENIERIA EN SISTEMAS INFORMATICOS Y DE COMPUTACIÓN

GR-1

Quito, Abril 28 del 2012

Analizador léxico en C++

Definición:

Un analizador léxico o analizador lexicográfico (scanner) es la primera fase de un compilador que es un programa que recibe como entrada el código fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de tokens o símbolos. Estos tokens sirven para una posterior etapa del proceso de traducción, siendo la entrada para el analizador sintáctico (parser).

Objetivos:

Crear un analizador léxico que reconozca por lo menos 20 tokens o símbolos.

Conocer un poco más la función que cumple el analizador léxico en la vida cotidiana.

Procedimiento:

Primero tenemos que tener muy claro que es un analizador léxico y que símbolos vamos a hacer que reconozca y cuáles no. Así que para este caso vamos a realizarlo así:

Palabras Reservadas (1) Variables (2) Constantes Numéricas (10) Operadores Aritméticos (4) Operadores Relacionales (6) Operadores Lógicos (3) Signos de Agrupación (3)

Page 3: Analizador léxico en C

III

ESCUELA POLITECNICA NACIONALINGENIERIA EN SISTEMAS INFORMATICOS Y DE COMPUTACIÓN

Signos de Puntuación (2)

En algunos casos existen mas símbolos que se van a reconocer de acuerdo a lo pedido.

Procedemos a seleccionar los símbolos a ser añadidos a nuestro analizador léxico, lo que vamos a utilizar es:

Como palabra reservada: “while”, Como variables: “x” y “y”, Como constantes numéricas: “los números del 0 al 9”, Como operadores aritméticos “+”, “-”, “*” y “/”, Como operadores relacionales “<”, “<=”, “>”, “>=”, “!

=”, “=”, Como operadores lógicos “&”, “|”, “~”, Como signos de agrupación: “(”, “)”, “{”, “}”, “[”,

“]”, Como signos de puntuación: “%”, “;”.

Lo que procedemos a programar y el código resultante es:

#include "stdafx.h"#include <iostream>#include <stdio.h>#include <conio.h>

using namespace System;using namespace std;

void main(){

char cadena[20];int k, j,tam=0, agru=0,salida=0;

while (salida!=1){

cout<<"Ingrese la cadena a analizar al finalizar ingrese ;"<<endl;

for(j=0;j<20;j++){

cin>>cadena[j];if (cadena[j]==';'){

k=j;j=20;

}}while (tam<k){

/*validacion de las variable*/if((cadena[tam]=='x')||(cadena[tam]=='y'))

cout<<cadena[tam]<<": Es variable"<<endl;/*validacion de la palabra reservada*/if((cadena[tam]=='w')||(cadena[tam]=='W'))

Page 4: Analizador léxico en C

IV

ESCUELA POLITECNICA NACIONALINGENIERIA EN SISTEMAS INFORMATICOS Y DE COMPUTACIÓN

{if((cadena[tam+1]=='h')||(cadena[tam]=='H')){

if((cadena[tam+2]=='i')||(cadena[tam]=='I'))

{if((cadena[tam+3]=='l') || (cadena[tam]=='L')){

if((cadena[tam+4]=='e') || (cadena[tam]=='E')){

for(int t=tam;t<tam+5;t++)

cout<<cadena[t];cout<<": Es palabra reservada"<<endl;tam=tam+4;

}else {

for(int t=tam;t<tam+4;t++)

cout<<cadena[t];cout<<": palabra reservada mal escrita"<<endl;

}}else {

for(int t=tam;t<tam+3;t++)cout<<cadena[t];

cout<<": palabra reservada mal escrita"<<endl;

}}else {

for(int t=tam;t<tam+2;t++)cout<<cadena[t];

cout<<": palabra reservada mal escrita"<<endl;

}}else {

for(int t=tam;t<tam+4;t++)cout<<cadena[t];

cout<<": palabra reservada mal escrita"<<endl;

}}/*validacion de los signos de agrupacion*/if((cadena[tam]=='(')||(cadena[tam]=='{')|| (cadena[tam]=='[')){

cout<<cadena[tam]<<": Se abre signo de agrupacion"<<endl;agru=agru+1;

}

Page 5: Analizador léxico en C

V

ESCUELA POLITECNICA NACIONALINGENIERIA EN SISTEMAS INFORMATICOS Y DE COMPUTACIÓN

if((cadena[tam]==')')||(cadena[tam]=='}')|| (cadena[tam]==']')){

cout<<cadena[tam]<<": Se cierra signo de agrupacion"<<endl;agru=agru-1;

}/*validacion de los operadores matematicos*/if((cadena[tam]=='+')||(cadena[tam]=='-')||(cadena[tam]=='*')|| (cadena[tam]=='/'))

cout<<cadena[tam]<<": Es un operador matematico"<<endl;

/*validacion de los operadores relacionales*/if(cadena[tam]=='<'){

if(cadena[tam+1]=='=')cout<<cadena[tam]<<cadena[tam+1]<<": Operador Relacional menor o igual a que"<<endl;

elsecout<<cadena[tam]<<": Operador Relacional menor que"<<endl;

}if(cadena[tam]=='>'){

if(cadena[tam+1]=='=')cout<<cadena[tam]<<cadena[tam+1]<<": Operador Relacional mayor o igual a que"<<endl;

elsecout<<cadena[tam]<<": Operador Relacional mayor que"<<endl;

}if(cadena[tam]=='!'){

if(cadena[tam+1]=='='){

cout<<cadena[tam]<<cadena[tam+1]<<": Operador Relacional diferente que"<<endl;tam=tam+1;

}}if(cadena[tam]=='=')

cout<<cadena[tam]<<": Operador Relacional igual que"<<endl;

/*validacion de los operadores logicos*/if(cadena[tam]=='&')

cout<<cadena[tam]<<": Operador logico and"<<endl;if(cadena[tam]=='|')

cout<<cadena[tam]<<": Operador logico or"<<endl;if(cadena[tam]=='~')

cout<<cadena[tam]<<": Operador logico negacion"<<endl;

/*validacion de los numeros*/if((cadena[tam]=='0')||(cadena[tam]=='1')|| (cadena[tam]=='2')||(cadena[tam]=='3')||(cadena[tam]=='4')|| (cadena[tam]=='5')||(cadena[tam]=='5')||(cadena[tam]=='6')|| (cadena[tam]=='7')||(cadena[tam]=='8')||(cadena[tam]=='9'))

cout<<cadena[tam]<<": Es un numero"<<endl;

Page 6: Analizador léxico en C

VI

ESCUELA POLITECNICA NACIONALINGENIERIA EN SISTEMAS INFORMATICOS Y DE COMPUTACIÓN

/*validacion de los signos de puntuacion*/if(cadena[tam]==';')

cout<<cadena[tam]<<": Simbolo de final de lo ingresado"<<endl;

/*Termina la aplicacion*/if(cadena[tam]=='%'){

cout<<cadena[tam]<<": Termina la ejecucion del programa"<<endl;salida=1;

}tam=tam+1;

}tam=0;for(j=0;j<k+1;j++)

cadena[j];if(agru!=0)

cout<<"Falta cerrar un signo de agrupacion"<<endl;agru=0;cout<<"Para finalizar el programa ingrese % en la sentencia"<<endl;

}system ("Pause");

}

Capturas de Pantalla:

Primera corrida:

Segunda y última corrida

Page 7: Analizador léxico en C

VII

ESCUELA POLITECNICA NACIONALINGENIERIA EN SISTEMAS INFORMATICOS Y DE COMPUTACIÓN

Conclusión:

Podemos llegar a decir que hemos cumplido los objetivos planteados además de haber solucionado el problema con una implementación exitosa en C++ y que nos permite utilizarlo con éxito.