Anda di halaman 1dari 13

UNIVERSIDAD AUTNOMA TOMAS FRAS FACULTAD DE CIENCIAS PURAS CARRERA INGENIERA INFORMTICA

Analizador Sintctico
Materia: Compiladores Docente: Lic. Maribel Condori. Estudiante: Univ. Maria Esther Romay M. Fecha: 19 - diciembre - 2011

Potos - Bolivia

COMPILADORES INF - 641

ANLISIS SINTCTICO
ANLISIS SINTCTICO

INTRODUCCION En todo Lenguaje de programacin existen reglas que prescriben la estructura sintctica de programas bien elaborados. En c++, por ejemplo, un programa se compone de bloques, un bloque de proposiciones, una proposicin de expresiones, una expresin de componentes lxicos y as sucesivamente. Se puede describir la sintaxis de las construcciones de los lenguajes de programacin por medio de gramticas independientes del contexto o notacin BNF (Forma de Backus - Naur). Las gramticas ofrecen ventajas significativas a los diseadores de lenguajes y a los escritores de compiladores. DEFINICIN DEL PROBLEMA El anlisis de la sintaxis es solamente verificar si el programa fuente est escrita de manera correcta y para poder realizar esa verificacin lo que se hace es reconocer un conjunto de tokens que es proporcionado por el analizador lxico adems el anl isis de sintaxis es simplemente verificar la correcta escritura del programa fuente; esa correcta escritura estar basada en la aplicacin apropiada y correcta, de las reglas de produccin de una gramtica. Por lo tanto, el anlisis sintctico, es el proceso de reconocer una cadena de tokens (que toma como entrada) y construir el rbol de derivacin correspondiente. Cuando se manifiesta el concepto de reconocer, se est haciendo referencia al proceso de determinar si una cadena de tokens de entrada puede ser generada por la gramtica libre de contexto que especifica la estructura sintctica del lenguaje fuente.

2 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

DEFINICIN DE OBJETIVOS OBJETIVO GENERAL Desarrollar un compilador para el lenguaje propio en c++. OBJETIVOS ESPECIFICOS Desarrollar el analizador lexicogrfico Desarrollar el analizador Sintctico La segunda fase en el proceso de compilacin de un programa fuente es el Analizador Sintctico al que tambin se le suele llamar Parser. El analizador sintctico se ocupa de determinar las estructuras sintcticas en las secuencias de tokens generadas por el analizador lexicogrfico. Desde otro punto de vista el analizador sintctico determina las estructuras sintcticas que el programador a utilizado en el programa fuente, adems de efectuar la tarea descrita el analizador sintctico verifica la correcta sintctica de cada construccin sintctica. El analizador sintctico metafricamente puede decirse que construye rboles sintcticos si el proceso de construccin es obstaculizado por algn smbolo puede afirmarse que existe error de sintaxis. Analizar sintcticamente una forma oracional o una cadena de tokens es encontrar para ella un rbol sintctico o de derivacin que tenga como raz el axioma de la gramtica del contexto libre mediante la aplicacin sucesiva de sus reglas de derivacin. En caso de xito se dice que la cadena pertenece al lenguaje y puede proseguirse con la etapa siguiente de la compilacin en caso de que la cadena no encuentre un rbol de derivacin asociado para el reconocimiento se producir un error aspecto que detendr el siguiente proceso; sin embargo este aspecto de mostrar errores y detenerse en un compilador no es muy saludable ya que se tendra que compilar tantas veces como errores se pudiese encontrar en el programa, aspecto que no se observa en los compiladores actuales. 3 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

De la forma como se construye un rbol sintctico es que se desprende dos tipos de analizadores sintcticos. Cuando se parte del axioma de la gramtica y se va descendiendo hasta poder reconocer la cadena completa (sentencia) se trata del

anlisis sintctico descendente; por el contrario si se parte de la cadena y se va


subiendo por el rbol utilizando las respectivas derivaciones hasta la localizacin de la raz o axioma se conoce con el nombre del anlisis sintctico ascendente. ANALIZADOR SINTACTICO

SOLICITA UN TOKEN

Lenguaj e fuente

Programa fuente

CARACTER

Analizador lexicogrfico

TOKEN

Analizador sintctico

ESTRUCTURAS SINTACTICAS CORRECTAS

TIPOS DE ANALIZADORES SINTACTICOS Anlisis sintctico ascendente Anlisis sintctico descendente ANALISIS SINTACTICO ASCENDENTE. Consiste en construir un rbol sintctico a partir de una sentencia para alcanzar el smbolo inicial. Las herramientas que nos facilitan la construccin del analizador sintctico son:

4 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

Las gramticas LL(1) Las cabeceras o conjuntos directores. ANALISIS SINTACTICO DESCENDENTE. Construye el rbol sintctico partiendo del smbolo inicial hasta alcanzar alguna sentencia para efectuar el anlisis descendente de manera automtica es conveniente(para simplificar la tarea) restringir la forma de escribir una gramtica en una gramtica LL(1). La forma ms habitual de representar un rbol sintctico para una cadena ( ) de smbolos, terminales y variables de una gramtica de contexto libre es la numeracin sucesiva de cada una de las alternativas o reglas BNF elementales que definen una meta nocin. A tal secuencia de nmeros suele denominarse Parse o Anlisis. Si se toma en cuenta las derivaciones que se pueden realizar para construir un rbol sintctico tomando en cuenta el nmero de producciones se podr hacer derivaciones ms a la derecha o ms a la izquierda. En este tipo de cuantificadores tambin con frecuencia se denominan Predictivos, puesto que se intenta predecir el siguiente nivel inferior del rbol esta prediccin se hace examinando el siguiente token en la entrada y el rbol actual. Las tcnicas para el anlisis sintctico descendente son: Descenso recursivo. Parsing LL(1) Estos dos mtodos de anlisis son los ms utilizados para construir si una cadena pertenece o no a las reglas sintcticas de un lenguaje, lo que no significa que no 5 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

existan otros mtodos, como referencia por ejemplo se tiene el Algoritmo CYK que tiene algunas restricciones en las gramticas de libre contexto. DESENSO RECURSIVO. El primero que estudio esta forma de reconocimiento fue Donald Knuth quien seal que una de las condiciones que debe cumplir una gramtica para aplicar el descenso recursivo es que no deber ser recursiva a la izquierda. Esta forma de reconocimiento es la ms utilizada en los lenguajes de programacin. Con este nombre se quiere especificar que se realiza una construccin descendente del rbol sintctico. En cuanto al calificativo de recursivo ser muy fcil aprovechar por el diseador cuando el anlisis sintctico se programe con un lenguaje de alto nivel se permitir la programacin de procedimientos recursivos. El anlisis descendente recursivo utiliza la tcnica de construir un procedimiento para cada variable que se encuentra en la gramtica cada uno de estos procedimientos puede leer la entrada, hacer concordar smbolos de un alfabeto o llamar a otros procedimientos para leer entradas y hacer coincidir terminales en el lado directo de una produccin. PARSING LL(1) Un Parsing LL(1) o analizador sintctico LL(1) es aquel que analiza una forma oracional tomando en cuenta la entrada de izquierda derecha y que va siguiendo las derivaciones de ms a la izquierda. Adems para decidir que dominio sintctico se tiene que tomar en cuenta le basta examinar solo un carcter a continuacin de donde se halla la forma oracional. Una gramtica LL(1) es una gramtica de contexto libre que impone restricciones en la forma de escribir las producciones lo cual simplifica la implementacin de un analizador sintctico. Las gramticas LL(1) simplifican la implementacin del analizador sintctico. 6 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

TRADUCCION DE GRAMATICAS LL(1) EN PROGRAMAS. Pueden seguirse las siguientes reglas para transformar gramticas programas. 1.- <A>::= ( (NUT)) procedimiento A inicio traducir fin. LL(1) en

2.produccin

parte derecha de una

traducir 1 123.... N traducir 2 traducir N

{ 1 , 2 , 3 ,........ n }

3.- 1 |2|3|.... |N

si clase { CD1}entonces traducir 1 sino si clase { CD1}entonces traducir 2 sino .......................................... si clase { CDN}entonces traducir N sino error sintctico fin

7 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO
mientras { CD} hacer inicio traducir 1 fin

4.-{ }

5- []

Si clase inicio

{ CD} hacer

traducir fin 6.- y T si clase = entonces siguientetoken() sino error sintactico;

ESPECIFICACIN FORMAL DEL LENGUAJE FUENTE (GRAMTICA BNF) GRAMTICA PARA EL LENGUAJE C++

<C++> ::= using system;class<DECLARA>;{public static void main(){<CUERPO>}} <DECLARA> ::=<TIPO><ID>{,<ID>} <TIPO> ::= intfloatStringdouble <CUERPO>::= <PRIMITIVAS><SCONTROL> <PRIMITIVAS> ::= <LECTURA><ESCRITURA><ASIGNACIN> <LECTURA> ::= Console.ReadLine <LISTA_ID>; <LISTA_ID> ::= <ID>{,<ID>} <ESCRITURA> ::= Console.WriteLine <ARGUMENTO>{,<ARGUMENTO>} <ASIGNACIN> ::= <ID>:=<EXPRESIN>; <ARGUMENTO> ::= <CADENA><EXPRESIN><LISTA_ID> <CADENA> ::= (ASCII) <EXPRESIN> ::=<TERMINO> {<SIGNO_TER><TERMINO>} <TERMINO> ::=<FACTOR> {<SIGNO_FACTOR><FACTOR>} <FACTOR> ::= <ID><NUMERO>(<EXPRESIN>) <SIGNO_TER> ::= + 8 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

<SIGNO_FACTOR> ::= * / % ++-<SCONTROL> ::= <SELECTIVAS> <REPETITIVAS> <SELECTIVAS> ::= <SI_SINO> <CASO> <SI_SINO>::= if(<COND>) <CUERPO>{,<CUERPO>} [else <CUERPO>] <EXP_LOGICA>::= <EXPRESIN> <OP_REL> < EXPRESIN > <OP_REL> ::= > >= < <= = <> <CASO> ::= switch( <ID>){ case <NUMERO> : <CUERPO> <REPETITIVAS>::= <FOR> <WHILE> <DO WHILE><FOREACH> <FOR>::= <WHILE>::= while { <CUERPO>} <FOREACH>::= foreach (<TIPO_ELEMENTO><ELEMENTO> IN <TERMINO>)<CUERPO> <MODIFICADOR>::=++--+=-= <TIPO_ELEMENTO>::=<TIPO> <ELEMENTO>::=<CADENA for (<ASIGNACION> =<ENTERO>;<CONDICION>;<MODIFICADOR>)<CUERPO>

9 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

Gramtica para las primitivas del lenguaje C++ <C++>::= using system;class<DECLARA>;{public static void

main(){<CUERPO>}} <DECLARA> ::=<TIPO><ID>{,<ID>} <TIPO> ::= intfloatStringdouble <CUERPO>::= <PRIMITIVAS> <PRIMITIVAS> ::= <LECTURA><ESCRITURA><ASIGNACIN> <LECTURA> ::= Console.ReadLine <LISTA_ID>;[<ID>=] Console.ReadLine <LISTA_ID> ::= <ID>{,<ID>} <ESCRITURA> ::=SY>;<CL><DECLA>;{<PB><ST><V><M>(){<CUERPO>}} Console.WriteLine <ARGUMENTO>{,<ARGUMENTO>} <PRG> ::= <U>< <ASIGNACIN> ::= <ID>:=<EXPRESIN>; <U>::= using <ARGUMENTO> <SY>::= system ::= <CADENA><EXPRESIN><LISTA_ID> <CADENA> ::= (ASCII) <CL>::=class <EXPRESIN> ::=<TERMINO> {<SIGNO_TER><TERMINO>} <DECLARA> ::=<TIPO><ID>{,<ID>} <TERMINO> ::=<FACTOR> {<SIGNO_FACTOR><FACTOR>} <PB>::=public <FACTOR> ::= <ID><NUMERO>(<EXPRESIN>) <ST>::=static <SIGNO_TER> ::= + <V>::=void <SIGNO_FACTOR> ::= * / % ++-<M>::=main()

<TIPO> ::= intfloatStringdouble <CUERPO>::= <PRIMITIVAS> <PRIMITIVAS> ::= <LECTURA><ESCRITURA><ASIGNACIN> <LECTURA> ::= Console.ReadLine <LISTA_ID>;[<ID>=] Console.ReadLine <LISTA_ID> ::= <ID>{,<ID>} <ESCRITURA> ::= Console.WriteLine <ARGUMENTO>{,<ARGUMENTO>} <ASIGNACIN> ::= <ID>:=<EXPRESIN>; <ARGUMENTO> ::= <CADENA><EXPRESIN><LISTA_ID> 10 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

<CADENA> ::= (ASCII) <EXPRESIN> ::=<TERMINO> {<SIGNO_TER><TERMINO>} <TERMINO> ::=<FACTOR> {<SIGNO_FACTOR><FACTOR>} <FACTOR> ::= <ID><NUMERO>(<EXPRESIN>) <SIGNO_TER> ::= + <SIGNO_FACTOR> ::= * / % ++-FORMA NORMAL DE CHOMSKI PARA LAS PRIMITIVAS DEL LENGUAJE C++ S AB A BB / a B AB/b <PRG> ::= <C1>< C2> <C1> ::= <B1>< B2> <C2> ::= <B3> <B1> ::= <A1>< A2> <C2> ::= <A3>< A4> <B3> ::= <A5>< A6> <A1> ::= <U>< SY> <A2> ::= <;> <CL> <A3> ::= <DECLA><;> <A4> ::= {<PB>< ST> <A5> ::= <V>< M> <A6> ::= <CUERPO>} <U>::= using <SY>::= system <CL>::=class <DECLA> ::= <X><Y> <X>::=<TIPO><ID> <Y>::={,<ID>} <PB>::=public <ST>::=static <V>::=void <M>::=main() <TIPO> ::= <T1><T2> <T1> ::=<int><float> <T2> ::=<String><double> 11 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

<CUERPO>::= <PRIMITIVAS> <PRIMITIVAS> ::=<W><ASIGNACIN> <W>::= <LECTURA><ESCRITURA> <LECTURA> ::= <Z><[<ID>=] Console.ReadLine> <Z>::= <Console.ReadLine > <ZZ>::=<LISTA_ID><;> <LISTA_ID> ::= <ID><CC> <CC>::={<,> <ID>} <ESCRITURA> ::= <A><B> <A>::=<Console.WriteLine <ARGUM>> <B>::={<,><ARGUM>} <ASIGNACIN> ::= <AAA><BBB> AAA::= <ID><IGUAL> BBB:= <EXPRESIN><;> <IGUAL>::= = <ARGUM> ::= <AA><LISTA_ID> <AA>::=<CADENA><EXPRE> <CADENA> ::= (ASCII) <EXPRE> ::=<TERMINO><XX> <XX>::={<SIGNO_TER><TERMINO>} <TERMINO> ::=<FACTOR> <YY> <YY>::={<SIGNO_FACTOR><FACTOR>} <FACTOR> ::= <ZZZ> <EXPRESIN> <ZZZ>::=<ID><NUMERO> <SIGNO_TER> ::= + <SIGNO_FACTOR> ::= * / % ++-CYK W= C=A+B DISEO GENERAL Y DETALLADO DE LOS ELEMENTOS INHERENTES AL TIPO DE ANLISIS <PRG> ::= 133,134;,144<DECLA>;143,138,139,140(){<CUERPO>}} <DECLARA> ::=<TIPO><ID>{,<ID>} <TIPO> ::= 146,126,135,148 <LISTA_ID> ::= <ID>{,<ID>} <CUERPO>::= <LECTURA><ID>;|<ID>=<ID>+<ID><ESCRITURA><ID>; 12 UNIVERSIDAD AUTNOMA TOMAS FRAS

COMPILADORES INF - 641

ANLISIS SINTCTICO

<LECTURA> ::= 132,116, <ID> <ESCRITURA> ::= 132,131, <ID> CABECERAS DEL PROGRAMA CABECERA(PRG) = 133 CABECERA(DECLARA) =146,121,135,148 CABECERA(TIPO) = 146 CABECERA(TIPO) = 126 CABECERA(TIPO) = 135 CABECERA(TIPO) = 148 CABECERA(LISTA_ID) = <ID> CABECERA(CUERPO)= <ID> CABECERA(LECTURA)= 132,116 CABECERA(ESCRITURA)= 132,131
PRG ; CLASS INT FLOAT STRING DOUBLE ID = + CONSOLE . WRITELINE READLINE DECLARA TIPO LISTA_ID CUERPO LECTURA ESCRITURA
;

13 UNIVERSIDAD AUTNOMA TOMAS FRAS