Sie sind auf Seite 1von 37

Programacin en Sistemas

Jair Macosay Montero

UNIDAD 1 INTRODUCCIN A LA PROGRAMACIN DE SISTEMAS


1.1 Qu es y qu estudia la programacin de sistemas? Programa: conjunto de instrucciones que ejecuta una computadora para realizar una actividad. Sistema: conjunto de elementos autnomos que trabajan en armona para alcanzar un objetivo en comn.

Tipos de sistemas Sistemas fsicos: equipo, maquinaria, objetos reales, Hardware Sistemas abstractos: ideas, hiptesis, conceptos, planes, Software Sistemas abiertos y cerrados dependiendo del ambiente en que se ejecutan.

Caractersticas de un sistema Estn bien delimitados, por lo tanto se conocen sus fronteras. Un sistema puede interactuar con su medio ambiente a travs de una interfaz de entradas y salidas que recibe el nombre de parmetros del sistema. Un sistema puede ser componente de otro sistema

Cul es la diferencia entre un tcnico y un ingeniero? A parte del grado acadmico, el tipo de programas que realizan. Generalmente un tcnico realiza software de aplicaciones (ABCD) o aplicaciones de gestin (nminas, control de inventarios, etc.) Un ingeniero es ms creativo, ms ciencia e investigacin; mientras que un licenciado aplica los conocimientos. Clasificacin del software Software de sistemas: software que ayuda (sirve de base) a otro software. Procesan estructuras de datos complejas

Programacin en Sistemas Tienen una fuerte dependencia con el hardware

Jair Macosay Montero

Utilizan una fuerte gestin de procesos (concurrencia, planificacin, etc.)

Clasificacin del software Software de aplicacin (gestin) Software de tiempo real Software empotrado Software de ingeniera y cientfico Software basado en Web Software de inteligencia artificial reas afines a la programacin de sistemas Teora de la computacin (lenguajes y autmatas). Lenguajes de programacin Arquitecturas de computadoras Algortmica Ingeniera del software 1.2 Herramientas desarrolladas con la teora de programacin de sistemas El caso ms sencillo de programacin de sistemas es la construccin de compiladores para ejecutar lenguajes de programacin. Pero no slo se aplica en lenguajes de programacin, sino tambin se aplica en cualquier programa que se tenga que hacer un anlisis o extraccin de informacin Software de sistemas Editores de texto inteligentes (IDEs con autocompletar, revisores ortogrficos, etc) Impresoras estticas (impresin de gran calidad sin un editor visual, Latex, etc.) Intrpretes (Shells de sistemas operativos o de alguna aplicacin como un SMBD) Bsqueda de informacin que no es tan comn en base a patrones, etc.

Programacin en Sistemas

Jair Macosay Montero

1.3 Lenguajes Conjunto de palabras y reglas que permiten comunicar informacin entre dos entidades. Lenguaje son las cadenas que pueden generarse a travs de una gramtica El lenguaje que entienden las mquinas (lenguaje formal) es muy diferente del lenguaje que entendemos los humanos Repaso de lenguajes y autmatas Smbolo: representacin abstracta de alguna entidad Alfabeto: conjunto finito de smbolos Cadena: yuxtaposicin de smbolos de un alfabeto que representan a un objeto Lenguaje: conjunto de cadenas vlidas que se pueden formar a travs de un alfabeto 1.3.1 Lenguajes naturales El lenguaje natural es inherentemente ambiguo, por lo que se necesita crear un lenguaje que permita eliminar esas ambigedades. Es mejor crear otro lenguaje, denominado de alto nivel que es el encargado de mediar entre la abstraccin humana y la abstraccin de lenguaje de mquina 1.3.2 Lenguajes artificiales Los lenguajes artificiales son aquellos que comunicarnos Las computadoras slo saben 0 y 1 Un lenguaje artificial permite implementar un resolver un problema. Lenguajes de bajo nivel Una abstraccin ms entendible del lenguaje mquina es el uso de lenguajes ensambladores en donde cada instruccin o mnemnico es traducido a una instruccin mquina. ADD AX, 5 LOAD A, 5 Lenguajes mquina El lenguaje mquina es dependiente de cada tipo de arquitectura de computadoras por lo que el cdigo no es fcilmente portable a otras arquitecturas. algoritmo en una computadora para los humanos hemos creado para

Programacin en Sistemas

Jair Macosay Montero

Los lenguajes de alto nivel son ms portables en lo que respecta al cdigo fuente pudiendo llevarse a otras arquitecturas de computadoras sin mayor problema.

Clasificacin de Chomsky Lenguajes sin restricciones (gramtica 0) Lenguajes dependientes del contexto (tipo 1) Lenguajes independientes del contexto (tipo 2) Lenguajes regulares (tipo 0 no presentan ambigedades, lo ideal para representarlas en una computadora) 1.3.3 Proceso de la comunicacin Para entablar una comunicacin se necesita que tanto el emisor como el receptor conozcan el mismo lenguaje o en su defecto tengan un traductor. En este sentido, los humanos escribimos algoritmos en un lenguaje formal que una computadora pueda transformar a un lenguaje entendible por ella. 1.4 Traductor y su estructura Un traductor es un mediador entre dos entidades: emisoras y receptoras Los mediadores enmascaran la complejidad y heterogeneidad de los lenguajes Un traductor convierte un lenguaje de entrada (cdigo fuente) a uno de salida (cdigo objeto)Traductor La traduccin puede ser sencilla (literal) o compleja (revisar el contexto) dependiendo del tipo de lenguaje de entrada y salida. Traduccin espaol a ingls si se hace de manera literal es una mala traduccin, se necesita de al menos otra revisin (pasada) para hacer una buena traduccin. Traductor

Programacin en Sistemas

Jair Macosay Montero

1.4.1 Ensambladores Ensamblador es el traductor que se encarga de convertir instrucciones de bajo nivel a instrucciones de una mquina en general //Encabezados 00 MOV AX, 58d 4F0188 03 CMP 0 3A00 05 JMP etiqueta 9918 Etiqueta: 18 MUL AX, FF 4401FF1.4.2 Compiladores Es el traductor que se encarga de convertir un lenguaje de alto nivel a cdigo mquina. La caracterstica de este traductor radica en el hecho de que necesita revisar todo el cdigo fuente para poder realizar la traduccin. Ejemplo: la traduccin de un libro, discurso, o artculo tcnico o de investigacin Ejemplos de compiladores: C, C++, Pascal, etc. Entre ms pasadas se de a un cdigo fuente mayor es la optimizacin que se puede hacer. El problema radica en el tiempo y en los recursos para hacerlo Antes de compilar un programa fuente se sigue una etapa de preprocesamiento. Preprocesadores: Macros (expansin de funciones) Inclusin de archivos (bibliotecas) Procesadores racionales Extensiones al leguaje (inclusin de ensamblador en C)

Programacin en Sistemas

Jair Macosay Montero

1.4.3 Intrpretes Se ejecutan lnea por lnea, instruccin por instruccin. Lenguajes interpretados: PHP, PERL, BASIC En algunas ocasiones se necesita de una traduccin rpida de algunas instrucciones, como en el Shell, instrucciones SQL, etc.Java es compilado o interpretado? Java al igual que otros lenguajes como C# son lenguajes hbridos. Por una parte se compila un programa fuente para generar cdigo objeto para una mquina virtual (bytecode o MSIL) para posteriormente ejecutarse de manera interpretada en las diferentes mquinas virtuales de cada plataforma. A este compilador se les llama jitter de JIT (Just in Time) 1.5 Generadores de cdigo para compiladores (compilador de compilador) Los dos primeros lenguajes de alto nivel desarrollado fueron FORTRAN y COBOL Desarrollar FORTRAN tard alrededor de 14 aos. Desarrollar nuestro compilador tardar menos de 6 meses Son herramientas que auxilian algn aspecto del proceso de traduccin

Programacin en Sistemas

Jair Macosay Montero

Herramientas auxiliares para programacin de sistemas Cargadores y editores de enlace Generadores de analizadores lxico Generadores de Analizadores sintcticos Traductores dirigidos por sintaxis Generadores automticos de cdigo Dispositivos para el anlisis de flujo de datos

Programacin en Sistemas

Jair Macosay Montero

UNIDAD 2 INTRODUCCIN AL DISEO DE LENGUAJES DE PROGRAMACIN


2.1 VISION PROBLEMA DE LOS LENGUAJES DE PROGRAMACION

LOS

Proporciona modelos de diseo que permitan caracterizar el desarrollo de aplicaciones utilizando un lenguaje de programacin se necesita un lenguaje de modelado que sea capaz de capturar la semntica del modelo al que se ajusta el lenguaje de programacin.

El modelado de diseo proporcionado por el lenguaje de modelado debe ser capas de capturar la semntica del programa que implementa la especificacin de requisitos.

El disear completamente un lenguaje. Si es que es el enfoque se toma, como sea, se debe tomar con cuidado para no hacer una extensin tan grande y compleja como se llega a ser, el hecho, de un nuevo lenguaje. En tales casos, la necesidad de retener algunas interfaces con un viejo lenguaje probablemente ceder gravemente el diseo de la extensin. Tambin, si uno extiende un lenguaje existente, es necesario escoger cuidadosamente un lenguaje base para que el trabajo de la extensin se aminorare y la extensin elegantemente quede dentro del lenguaje. El objetivo debe ser el de producir un lenguaje el cual se ms grande aun que igualmente bien construido.

2.2 CONSIDERACIONES PRELIMINARES DE DEL DISEO DE LENGUAJES DE PROGRAMACION

Debemos tomar en cuenta las palabras reservadas del lenguaje, los operadores, los tipos de datos. Debemos considerar el objetivo del lenguaje, si es un lenguaje de enseanza, si es un lenguaje para profesionales, si el cdigo desarrollado va a ser mejor.

EFICIENCIA DE LOS LENGUAJES DE PROGRAMACION

Programacin en Sistemas

Jair Macosay Montero

Compilacin rpida del cdigo fuente y ejecucin rpida del cdigo objeto.

Los factores fundamentales en la calidad del software son: la eficiencia, la portabilidad, la verificabilidad, la integridad, la facilidad de uso, la exactitud, la robustez, la extensibilidad, la compatibilidad y la reutilizacin. En trminos generales, estos factores pueden describirse de la siguiente forma:

La eficiencia: capacidad para el aprovechamiento ptimo de los recursos que emplea.

Los lenguajes OOP arrastraron en un principio la reputacin de ser ineficaces. Esto se deba en gran medida a que los primeros lenguajes (como Smalltalk) eran interpretados y no compilados. La existencia de compiladores permite a los desarrolladores ganar rapidez. Actualmente, usando un buen lenguaje orientado a objetos como C++, Java, etc. Junto con las libreras apropiadas para la realizacin de un programa, puede que se ejecute ms rpidamente que el mismo programa compilado con un lenguaje procedural

La portabilidad: facilidad para ser ejecutados en distintos entornos lgicos o fsicos .

La verificabilidad: capacidad para soportar procedimientos de pruebas, test o ensayos.

La integridad: nivel de proteccin frente a procesos que traten de alterarlo.

La facilidad de uso: comodidad y claridad en la interaccin con el usuario.

La exactitud: nivel de precisin que alcanzan los resultados obtenidos.

La robustez: capacidad para funcionar correctamente en situaciones extremas.

Programacin en Sistemas

Jair Macosay Montero

La extensibilidad: capacidad para adaptar su funcionamiento al incremento en sus objetivos.

La compatibilidad: facilidad de poder ser aplicados en conjuncin con otros programas.

La reutilizacin: posibilidad de utilizarlos (total o parcialmente) en nuevos contextos.

Para el diseo de lenguajes de Programacin se debe considerar varios aspectos, entre ellos las tareas que se desean realizar y los datos a manejar. Generalmente diseamos un lenguaje porque necesitamos comunicarnos con algo de manera fcil y rpida, por ejemplo un archivo, un hardware, una base de dato; ependiendo de la tarea que se quiera realizar entonces diseamos.

Una forma de como hacerla y como podemos relacionarlo con otras tareas para permitir que esa relacin pueda ser automatizada. Adems de las tareas que se van a realizar tambien se debe pensar en los tipos de datos que se van a manejar, por ejemplo nmeros, cadenas, ya que si se van a realizar operaciones, hay que pensar en que espacio de memoria se van a almacenar. Otras cosas a considerar son como se va a manejar la memoria, y a que tipo de computadoras estarn enfocados.

2.3 OBJETIVOS Y FILOSOFIAS DEL DISEO DE LENGUAJES DE PROGRAMACION

El principal objetivo del lenguaje es, por supuesto, servir de apoyo didctico en una materia de lenguajes de programacin, intrpretes y compiladores. Derivado de la persecucin de este objetivo surgen varias metas especficas y objetivos particulares:

La apreciacin del desarrollo e implementacin de un lenguaje de programacin.

Programacin en Sistemas

Jair Macosay Montero

La comprensin del procedimiento seguido en la formacin de un conjunto de reglas gramaticales que permiten identificar y nombrar sin ambigedad acciones y secuencias ordenadas de acciones sobre el contexto especfico de un problema en particular.

Proporcionar un medio de familiarizacin con la realizacin de operaciones aritmticas usando una pila y su posterior extensin para la manipulacin de otros datos.

La clara especificacin y adecuada documentacin del proceso de creacin o extensin de un lenguaje y sus resultados.

En el diseo de Stop se ha tratado de seguir muchos de los principios usados en los modernos lenguajes de programacin hasta el punto donde su implementacin no sea demasiado complicada para el desarrollo de un proyecto semestral. Principalmente se ha buscado que sea regular, modular y estructurado.

FILOSOFA DE DISEO DEL LENGUAJE

El lenguaje de programacin esta pensado para la programacin evolutiva. Esta consiste en un mtodo de programacin basado en un ciclo de prueba y error donde se refina un programa hasta conseguir que haga lo que queremos. Esta forma de programar se aplica a problemas donde se desconoce que algoritmo nos llevar a la solucin. Esta situacin se da en investigacin y en la creacin de prototipos donde hay que realizar muchas pruebas hasta dar con la solucin ms apropiada. Para estos casos, es ms apropiado el uso de un interprete que un compilador, ya que de esta forma se reduce el tiempo invertido en cada prueba.

Para que un lenguaje sea efectivo en programacin evolutiva tiene que facilitar: la interaccin, la modificacin del programa y aportar instrucciones de alto nivel cercanas al problema. Estos tres punto se consiguen cuando el lenguaje tiene las siguientes caractersticas:

Estado de Interaccin. Entre prueba y prueba es interesante guardar el estado de ejecucin. De esta forma se evita repetir la ejecucin de las instrucciones necesarias para llegar al estado de ejecucin donde queremos realizar pruebas. Los programas

Programacin en Sistemas

Jair Macosay Montero

implementa esta caracterstica mediante un mbito global dinmico que guarda funciones y variables mientras se utiliza el intrprete.

Sintaxis Cercana al Problema. Es ms efectivo escribir en una notacin cercana al problema que adaptarse a la sintaxis de un lenguaje de programacin. De esta forma se evita el paso de traduccin que tiene que realizar el programador antes de escribir una nueva sentencia del programa.

2.4 DISEO DETALLADO DE LENGUAJES DE PROGRAMACION

El diseo detallado tiene que ver con la especificacin de detalles algortmicos, representaciones concretas de datos, interconexiones entre funciones y estructuras de datos, y empaque del producto de programacin. El diseo detallado est fuertemente influenciado por el lenguaje de instrumentacin, pero no es lo mismo que la instrumentacin; el diseo detallado tiene que ver ms con aspectos semnticos y menos con detalles sintcticos que es la instrumentacin.

El punto de inicio para el diseo detallado es una estructura arquitectnica a la que se le van a proporcionar los detalles algortmicos y las representaciones concretas de datos. Mientras que hay una fuerte tentacin para proceder directamente de la estructura arquitectnica a la instrumentacin, hay varias ventajas que pueden lograrse en el nivel intermedio de detalle proporcionado por el diseo detallado.

La instrumentacin comunica los aspectos de la sintaxis del lenguaje de programacin, el estilo de codificacin la documentacin interna, y la insercin de pruebas y depuraciones al cdigo. Las dificultades que se encuentran durante la instrumentacin casi siempre se deben al hecho de que el instrumentador simultneamente est realizando anlisis, diseo y actividades de codificacin mientras intenta expresar el resultado final en un lenguaje de instrumentacin. El diseo detallado permite el diseo de algoritmos y representaciones de datos en un nivel ms alto de abstraccin y notacin que el que proporciona el lenguaje de instrumentacin .

Programacin en Sistemas

Jair Macosay Montero

El diseo detallado separa la actividad de diseo a bajo nivel de la instrumentacin, igual que las actividades de anlisis y diseo aislan las consideraciones de lo que se desea de la estructura que lograr los resultados deseados. Una especificacin adecuada de diseo detallado minimiza el nmero de sorpresas durante la instrumentacin del producto.

Programacin en Sistemas

Jair Macosay Montero

Unidad 3 Anlisis Lxico.


3.1 Introduccin a los Autmatas finitos y expresiones regulares. Qu es un autmata? Es un modelo cadena pertenece a un lenguaje no. M = (Q, , &, F) Q = conjunto de estados = alfabeto de entrada & = funciones de transicin F = conjunto de estados de aceptacin matemtico que sirve para determinar si una

Autmatas finitos La caracterstica que tienen los autmatas finitos es que solo existe una funcin de transicin definida para un smbolo de entrada. Esto elimina ambigedades Una expresin regular es una forma abreviada de representar lenguajes: a Representa el lenguaje de las letras a a* Representa el lenguaje que tiene 0 hasta n as Autmatas Oprel  <|>|<=|>=|=|<> Un solo autmata varios sub_autmatas Programar un autmata: Identificador  letra (letra|digito|gb)* Expresin Regular Generar la expresin regular para identificar correos electrnicos vlidos. Formato: jcolivar@itmorelia.edu.mx id@dominio

Programacin en Sistemas

Jair Macosay Montero

Expresiones Regulares y una gramatica Una gramtica sirve para generar cadenas de un determinado lenguaje pero tambin sirve para generarla. Existente una relacin uno a uno entre Lenguajes, Autmatas, Expresiones regulares y gramticas. Gramtica de un if prop if expr then prop

| if expr then prop else prop | expr termino oprel termino

| termino termino | num Gramtica de un if oprel  < |>|=|<=|<>|>=| id  letra (letra | digito)* num  digito+ (.digito+)?(E(+| )?digito+)? eb  delim+ delim  blanco | tab | line nueva 3.2 Anlizador Lxico Primera fase de la compilacin Leer caracteres de entrada y generar como salida una secuencia de componentes lxicos Eliminar espacios en blanco Eliminar comentarios Proporcionar informacin acerca de errores lxicos id

Programacin en Sistemas

Jair Macosay Montero

Anlisis Lxico El anlisis lineal, se llama lxico o exploracin. Posicion := inicial + velocidad * 60 Posicion: identificador := smbolo de asignacin Inicial: identificador Anlisis Lxico +: signo de suma Velocidad: identificador *: signo de multiplicacin 60: numero Se elimina todos los espacios en blancos (espacios, tabuladores, salto de lnea, etc.) Anlisis Lxico Reconocedores de identificadores y palabras clave La tabla de smbolo debe insertar y buscar componentes lxicos

Programacin en Sistemas

Jair Macosay Montero

La tabla de smbolos es utilizada por el analizador sintctico y por otras fases del proceso de traduccin

Anlisis lxico Un patrn es una regla que describe el conjunto de lexemas que puede representar a un conjunto lxico Los componentes lxicos se tratan como terminales de la gramtica del lenguaje fuente La devolucin de un componente lxico se hace a travs de un nmero entero Especificacin de componentes lxicos Expresiones regulares (patrn) Cada patrn concuerda con una serie de cadenas Las expresiones regulares dan el nombre al conjunto de cadenas con que concuerdan Expresiones regulares Se construyen a partir de otras expresiones regulares ms simples Cada expresin regular r, representa un lenguaje L(r) Letra a u b u c u u z Dgito 1 u 2 u 3 u u 0 Identificador letra(letra u dgito)*

Programacin en Sistemas

Jair Macosay Montero

Definiciones regulares Dan nombres a las expresiones regulares Nos permiten referenciarlas recursivamente Digito  1|2|3|4|5|6|7|8|9|0 Entero  dgito+ Decimal  .dgito+ | .dgito+E(+| | )dgito+ Real  entero (decimal | )Abreviaturas * cero o ms casos + uno o ms casos [a-zA-Z] maysculas y minsculas [0-9] dgitos ? Cero o un caso Abreviaturas Digito  [0 -9] Entero  digito+ Decimal  .digito+ exponente? Exponente  (E|e) (+| )?digito+ Real  entero decimal?3.3 Ma nejo de localidades temporales de memoria (buffers) La forma ms fcil de leer un programa es carcter por carcter pero es ineficiente. La forma ms eficiente es realizar una copia a la memoria de todo el cdigo fuente. Pero esto en la gran mayora de las ocasiones es imprctico por las dimensiones de los programas. Para solucionar este problema se sugiere utilizar buffersManejo de buffers Existen muchas formas de dividir el trabajo, pero siempre se deber llevar dos punteros, uno al carcter actual y otro al inicial del lexema. El manejo de buffers es esencial para realizar el anlisis de grandes programas de mejor manera 3.4 Creacin de tablas de smbolos

Programacin en Sistemas

Jair Macosay Montero

En general el proceso de anlisis lxico puede describirse simplemente como el reconocimiento de caracteres de un lenguaje para generar una tabla de smbolos. El primer paso consiste en crear un escner, el cual se encarga de verificar que no existan caracteres no presentes en el lenguaje. Tabla de smbolos La tabla de smbolos va a guardar cada palabra analizada, la va identificar como un lexema y le va asociar un identificador numrico para posteriormente utilizarlo. La tabla de smbolos debe estar en memoria para realizar un anlisis rpido.3.5 Manejo de errores lxicos Son pocos los errores que se pueden detectar al hacer anlisis lxico fi (a == f(x)) //Error de sintaxis Pero puede existir algn error si ninguno de los patrones con cuerda con el prefijo de entrada Tcnicas de recuperacin de errores Borrar un carcter extrao Insertar un carcter que falta Reemplazar un carcter incorrecto por otro correcto Intercambiar dos caracteres adyacentes Tcnicas para realizar analizadores lxicos Utilizar un analizador lxico como FLEX. El generador se encarga de manejar buffers Escribir el analizador en un lenguaje de alto nivel haciendo uso de la E/S del lenguaje Escribir el lenguaje ensamblador y manejar explcitamente la E/S Anlisis Lxico en XML El anlisis lxico en documentos XML lo realiza cualquier herramienta o API que utilice XML, ya que debemos cerciorarnos que el lenguaje est bien formado. Si el lenguaje no cumple con las reglas de construccin de documentos XML, falla el proceso. Realizar anlisis lxico de XML en Java o C#3.6 Generadores de cdigo lxico: Lex y Flex

Programacin en Sistemas FLEX es la versin de software libre del popular

Jair Macosay Montero

generador de analizadores lxicos LEX para sistemas *NIX, genera cdigo C aunque existen otras herramientas que generan cdigo en otros lenguajes Analizador.lex flex lex.yy.c gcc

Programa ejecutable analizador $gcc lex.yy.c o analizador lfl Programa Lex %{ Definiciones globales C }% Definiciones flex %% Acciones %% Cdigo C auxiliar Definiciones regulares en flex %% Separadores de secciones Def expresin

Acciones {def} {cdigo C asociado} @ {cdigo C asociado} Programa que reconoce flotantes %{ #include <stdio.h> Int ocurrencias; }% Digito[0-9]

Programacin en Sistemas

Jair Macosay Montero

Punto [\.] Exp [eE] Signo[\+\-] Digitos {digito}+ Decimal {punto} {digitos}({exp}{signo}{digitos})? Flotante {digitos}{decimal}? Programa que reconoce flotantes %% {flotante} { printf(flotante encontrado\n); ocurrenicas++; } @ { printf(Arroba\n); } . { printf(Invlido: %s\n, yytext); } %% Programa que reconoce flotantes main(int argc, char *argv[]) { FILE *f; F = fopen(argv[1], r); yyin = f; while(yylex()); printf(%d flotantes encontrados\n, ocurrencias); fclose(f); } Programa para reconocer direcciones IP Digito [0-9]

Programacin en Sistemas

Jair Macosay Montero

Punto [\.] IP {digito}+{punto}{digito}+{punto}+{digito}+ {punto}{digito}+ %% {IP} { strcpy(aux, yytext); strcat(aux, .); for(i =0 ; i<4; i++) { Programa para reconocer direcciones IP cadnum = strtok(aux, .); if(atoi (cadnum)>255) { printf(Error\n); break; } if(i==4) printf(Direccin IP: %s\n, yytext); }

Programacin en Sistemas

Jair Macosay Montero

Unidad 4 Anlisis sintctico.


4.1 Introduccin a las Gramticas libres de contexto y rboles de derivacin. Todo lenguaje posee una serie de reglas para describir los programas fuentes (sintaxis). Un analizador sintctico implementa estas reglas haciendo uso de GICs Gramticas Son un formalismo matemtico que permite lenguaje dado. decidir si una cadena pertenece a un

Se define como la cuarteta G= (N, , S, P), en donde N es el conjunto de smbolos terminales, es conjunto de smbolos terminales, S es el smbolo inicial (S pertenece a N) y P es un cojunto de reglas de produccin. Gramticas Los smbolos no terminales (N) son aquellos que pueden seguir derivando en otros; mientras que los terminales el proceso finaliza all. Las reglas de produccin siguen el formato:  donde y pertenecen a N y en cualquier forma. Reglas de produccin Son las reglas que permiten decidir si la cadena pertenece a un lenguaje y la estructura que lleva: SA|aB B AaA|bC C S Genera cadenas del lenguaje a*b u a Tipos de gramticas Las gramticas ms sencillas son las gramticas regulares, debido a que no presentan anomalas de ningn tipo. Desafortunadamente este tipo de gramticas no permiten expresar todos los lenguajes posibles y en especial los humanos por lo que se necesitan otros tipos de gramticas. Las ms utilizadas en informticas son las libres del contexto. Gramticas Regulares Son las que se forman a travs de Autmatas Finitos Deterministas y Expresiones regulares. No presentan ambiguedades. Sus reglas de produccin son del tipo: 

Programacin en Sistemas donde pertenece a N y pertenece a ()* N? Gramticas Independientes del Contexto

Jair Macosay Montero

Son aquellas G cuya reglas de produccin son de la forma: , en donde pertenece a N y pertenece (N u )* Las ventajas de uso de GICs son: Proporcionan una estructura sintctica precisa y fcil de comprender Gramticas Independientes del Contexto Proporciona al lenguaje fuente una estructura adecuada para la generacin del cdigo. Por medio de las GICs es fcil construir analizadores sintcticos Es sencillo aadir funcionalidades a un analizador Sintctico GICs Hay que revisar que la gramtica no sea inherentemente ambigua para poder eliminar esa ambigedad o redisear la gramtica sin anomalas. Algunas formas de eliminar esa ambigedad es utilizando tcnicas como algoritmos CYK y las formas normales de Chomsky (FNCh) y Greibach (FNG). Ejemplos de GICs Expresiones vlidas en lenguajes C: Expr NUM Error sintctico: cuando la secuencia de componentes lxicos no puede ser generada por la gramtica del lenguaje fuente. Ejemplos de GICs Declaracin de variables en C: Decl TIPO listavar PYC (expr) | - expr | expr op expr| VAR |

Programacin en Sistemas

Jair Macosay Montero

Listavar Var

var | var COMA listavar

ID | ASTER var CI ENTERO CD |CI ENTERO

Dimension

CD dimensin Jerarqua de Chomsky Las otras dos gramticas en las cuales clasific Chomsky (GR tipo 3, GIC tipo 2) son las gramticas sensible al contexto (tipo 1, donde || < ||, donde y pertenecen a ( u N)* salvo ) y las gramticas del tipo 0 o sin restricciones, las cuales sus reglas de produccin pueden ser de cualquier tipo. rboles de Derivacin Es la representacin grfica de la derivacin de una cadena. Se crea utilizando el smbolo inicial como la raz, los smbolos N representan nodos del rbol y los smbolos las hojas del rbol. A travs de los rboles de derivacin se puede verificar la sintaxis de un lenguaje as como comprobar el significado de las palabras. rboles de derivacin Si para la misma cadena existen dos o ms rboles de derivacin la gramtica es ambigua. S A a a BNF La Forma Backus-Naur es una meta-sintaxis; es decir, una sintaxis para representar sintaxis. Es un estndar para representar lenguajes. Los parntesis triangulares < y > sirven para indicar los smbolos no terminales. La barra vertical | para representar O BNF c Ab

Programacin en Sistemas La doble flecha  indica las derivaciones ::= indica  las producciones [] indican elementos opcionales {} indican trminos repetitivos 4.2 Diagramas de sintaxis

Jair Macosay Montero

Es otra forma (al igual que los rboles de derivacin) de especificar gramticas del tipo 2. La caracterstica de este esquema es que permite ver las derivaciones al instante de que ocurren.

4.3 Precedencia de operadores La precedencia de operadores es de vital sintctico ya que nos representar la forma derivacin. importancia en el proceso de anlisis en que debe construirse el rbol de

En aritmtica existen prioridades, por ejemplo: * y / tienen preferencia sobre + y -. () indican la mxima prioridad. Prioridad de operadores La instruccin a = b + c / 2 en la mayora de los lenguajes no se evala de la forma a = (b + c) /2, sino de la forma a = b + (c/2)

Programacin en Sistemas

Jair Macosay Montero

La forma de evaluacin depende de cmo se construyan los operadores, ya sea en infijo, postfijo o prefijo. Las operaciones se realizan de abajo hacia arriba. 4.4 Analizador sintctico Un analizador sintctico (Parser) es un programa que reconoce si una o varias cadenas de caracteres forman parte de un determinado lenguaje. Los lenguajes habitualmente reconocidos por los analizadores sintcticos son los lenguajes libres de contexto. Analizador sintctico Los analizadores sintcticos fueron extensivamente estudiados durante los aos 70 del siglo XX, detectndose numerosos patrones de funcionamiento en ellos, cosa que permiti la creacin de programas generadores de analizadores sintcticos a partir de una especificacin de la sintaxis del lenguaje, tales y como YACC, GNU bison y javacc. Anlisis sintctico Es el proceso de determinar si una cadena dada gramtica. puede ser generada por una

Los analizadores sintcticos de lenguajes de programacin suele hacerse de izquierda a derecha, viendo un componente lxico a la vez Los analizadores pueden clasificarse dependiendo de la forma en como se construyen los nodos del rbol de derivacin sintctico: ascendentes y descendentes

Programacin en Sistemas

Jair Macosay Montero

Anlisis sintctico Las gramticas se pueden expresar en forma BNF (Backus-Naur Form). El anlisis sintctico impone una estructura jerrquica. id1 :=

Programacin en Sistemas

Jair Macosay Montero

id2 + id3 * 60 Tipos de analizadores sintcticos LL (left to left) leen la cadena de izquierda a derecha y derivan por la izquierda LR (left to right) SaA AaBbC Bb Cc 4.4.1 Analizador descendente (LL) Existen diferentes mtodos de anlisis sintctico. La mayora caen en una de dos categoras: ascendentes y descendentes. Los ascendentes construyen el rbol desde las hojas hacia la raz. Los descendentes lo hacen en modo inverso. Un analizador ampliamente utilizado se descendente recursivo que es muy sencillo. Analizador descendente Derivacin izquierda: SaAaaBbCaabbCaabbc (1234) SaAaaBbCaaBbcaabbc (3421) LL(k) traductores top-down Un anlisis anticipado de k caracteres Analizador descendente SaS|cA AbA|cB| BcB|a| Construir cadena acbb SaS o ScA; al anticipar el primer smbolo denomina mtodo de anlisis predictivo

Programacin en Sistemas

Jair Macosay Montero

Analizador descendente L={anabcn | n>0} SaSc|aabc Se requiere una anticipacin de por los menos tres smbolos LL(3) SaaAc ASc|abc LL(1) 4.4.2 Analizador ascendente (LR, LALR) Algunos problemas no se pueden resolver de forma descendente ya que no estn fcil quitar la ambigedad. En algunos casos es ms fcil demostrar algo ya existente. Generalmente los analizadores sintcticos LR(k) son del tipo bottom-up Analizador ascendente El analizador trata de reducir la cadena de entrada w al smbolo inicial S. En un proceso que recorre el rbol de derivacin en sentido inverso que se llama reduccin.

Programacin en Sistemas

Jair Macosay Montero

No slo es necesario una gramtica que no presente ambigedades sino que tambin tenga el valor de k ms pequeo.

4.5 Administracin de tablas de smbolos La tabla de smbolos se crea durante la fase componentes lxicos, pero en el proceso de modificaciones. de anlisis lxico a travs de los anlisis sintctico sufren algunas

Generalmente se agregan valores de tipo y significado para el anlisis sintctico.4.6 Manejo de errores sintcticos y su recuperacin. Si los traductores tuvieran que procesar programas implantacin se simplificara mucho. correctas el proceso de

Cmo debe de responder un compilador de pascal a un cdigo Fortran? Ningn mtodo de recuperacin de errores resuelve todos los problemas Tipos de errores Lxicos: como escribir mal un identificador, palabra clave u operador. Sintcticos: como una expresin aritmtica con parntesis no equilibrados. Semnticos: como un operador aplicado a un operadorando incompatible. Lgicos: como una llamada infinitamente recursiva

Programacin en Sistemas

Jair Macosay Montero

Tipos de errores La mayora de los errores se centra en la fase de anlisis sintctico. El manejador de errores debe: Informar la presencia de errores con claridad y exactitud. Administrador de errores Recuperar de cada error con la suficiente rapidez como para detectar errores posibles. No debe retrasar de manera significativa el procesamiento de programas correctos. Debe indicar la lnea del error y algn mensaje informativo Estrategias de recuperacin de errores Modo Pnico Nivel de Frase Producciones de error Correccin global Recuperacin en modo pnico Es el ms sencillo de implantar. El analizador sintctico desecha componentes lxicos hasta encontrar un carcter de sincronizacin. Estos caracteres son el punto y como (;) entre otros. Recuperacin en modo pnico int a.b,c; struct c { . } main() { int a;

Programacin en Sistemas

Jair Macosay Montero

} Recuperacin a nivel de frase Esta tcnica utiliza una correccin de caracteres adyacentes, ya sea por insercin, eliminacin o intercambio. Esta tcnica permite sustituir , por ;, etc. Son traductores que corrigen errores. Desafortunadamente para muchos casos no demasiados. Producciones de error Se pueden generar gramticas para generar producciones de error y as de esta forma seguir con el proceso. La dificultad radica en el sentido de encontrar esas reglas gramaticales para generar error. En algunos casos sera inclusiva ms extensa que la gramtica del propio lenguaje. for(i<3, a<10; i++) Correccin global Idealmente, sera recomendable que un traductor hiciera el mnimo de cambios para procesar una entrada invlida. Este algoritmo genera menores costos globales para realizar cambios. El problema radica en que el implementar estas estrategias son muy costosas en tiempo y espacio. 4.7 Generadores de cdigo para analizadores sintcticos: Yacc, Bison YACC (YET ANOTHER COMPILER- COMPILER): provee una herramienta general para describir la entrada de un programa de computacin. El usuario de YACC especifica las estructuras de su entrada, junto con el cdigo que ser invocado en la medida en que cada una de esas estructuras es reconocida. YACC/BISON YACC convierte esa especificacin en una subrutina que maneja el proceso de entrada. La subrutina de entrada producida por YACC llama a la rutina provista por el usuario para devolver el prximo tem bsico de la entrada. YACC/BISON aplican por lo que no se utilizan

Programacin en Sistemas

Jair Macosay Montero

GNU Bison es un generador de parsers de propsito general que convierte una descripcin gramatical desde una gramtica libre de contexto LALR en un programa en C para hacer el parser. Es utilizado para crear parsers para muchos lenguajes, desde simples calculadoras hasta lenguajes complejos. YACC/BISON GNU Bison tiene compatibilidad con Yacc: todas las gramticas bien escritas para Yacc, funcionan en Bison sin necesidad de ser modificadas. Cualquier persona que est familiarizada con Yacc podra utilizar Bison sin problemas. Es necesaria experiencia con C para utilizar Bison. YACC Yet Another Compiler-Compiler Analizador.y (#include lex.yy.c)  bison  analizador.c (y.tab.c) $gcc analizador.c o analizador lfl Estructura de un programa en Bison %{ Declaraciones globales C }% Declaraciones bison %% Gramticas Nombre:prod1|prod2||prodn; %% Cdigo auxiliar C Tips Todo lexema debe ser un entero #define VAR 200 (256) return (VAR); gcc analizador

Programacin en Sistemas

Jair Macosay Montero

Gramtica vaca Gramtica: prod1| prod2| ; Tips Reduce/Reduce  ambigedad infinita Shift/Reduce SA Sb A b A a|b|c demasiada profundidad A x|y|z Analizador.lex %{ #include ytab.h }% sp [\n\r\t] If [i][f] %% {if} {return (IF);} ( {return (PI); } . return (ERROR); %% Analizador.y %{ #include lex.yy.c }%

Programacin en Sistemas

Jair Macosay Montero

%token IF PI PD LLI LLD %token ID NUM OPREL OPLOG %% programa: linea programa | ; Analizador.y Linea: if linea | ; if: if PI condicion PD LLI campo LLD ; .: {printf(Error sintctico);} %% main(int argc, char *argv[]) { FILE *f = fopen(argv[1], r); yyin = f; while (yyparse()); fclose(f); } Bison $flex analizador.lex $bison analizador.y $gcc analizador.c o analizador lfl yytext componente lxico

Programacin en Sistemas yyin flujo de entrada yylineno lnea de error%% yyerror() { printf(Error sintctico en %d linea, yylineno); }

Jair Macosay Montero

Das könnte Ihnen auch gefallen