Analizador léxico en C
-
Upload
alejandro-bolanos -
Category
Documents
-
view
99 -
download
11
Transcript of 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
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)
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'))
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;
}
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;
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
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.