8 Analisis Sintactico Descendente

43
1 Compiladores e Intérpretes 3 er curso 2º cuatrimestre Tema 8. Análisis sintáctico descendente 8.1 Introducción 8.2 Análisis descendente no determinista: backtracking 8.3 Análisis descendente determinista: LL(1) 8.3.1 Gramáticas LL(1) 8.3.2 Uso de la tabla de análisis

Transcript of 8 Analisis Sintactico Descendente

  • 1Compiladores e Intrpretes

    3er curso2 cuatrimestre

    Tema 8. Anlisis sintctico descendente

    8.1 Introduccin8.2 Anlisis descendente no determinista: backtracking8.3 Anlisis descendente determinista: LL(1)

    8.3.1 Gramticas LL(1) 8.3.2 Uso de la tabla de anlisis

  • 23

    8.1

    Introduccin

    4

    Hasta ahora hemos estudiado cmo hacer anlisis ascendente con las tcnicas LR, SLR y LALR. Ahora vamos a ver varios enfoques descendentes.

    La principal diferencia es que ahora el anlisis parte del axioma, y hay que encontrar una derivacin que lleve hasta el programa proporcionado como entrada.

    El problema es que el nmero de posibles derivaciones es muy grande.

    Ya se ha estudiado en asignaturas como IA la existencia de estrategias generales (para cualquier problema) de bsqueda ciega y sus propiedades de las que se mencionan algunas:

    Las dos estrategias bsicas son en anchura y en profundidad. La bsqueda en anchura expande todos los nodos del mismo nivel antes de

    descender a los hijos. De esta forma, siempre se puede conseguir encontrar la solucin ptima (aquella para la que se requiere un menor nmero de pasos).

    La bsqueda en profundidad expande todos los nodos hijos de un nodo antes que los nodos hermanos. En profundidad, excepto rboles infinitos, se suele tener oportunidad de encontrar alguna solucin con menos esfuerzo.

    Anlisis sintctico descendenteIntroduccin (I)

  • 35

    Anlisis sintctico descendente

    Veamos un ejemplo de anlisis descendente:

    + *

    E

    E

    E E-> E+E

    Introduccin (II)

    id id id

    Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

    6

    Anlisis sintctico descendente

    + *

    E

    E

    E E-> id

    Introduccin (III)

    id id id

    Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

  • 47

    Anlisis sintctico descendente

    + *

    E E

    E

    E

    E E-> E*E

    Introduccin (IV)

    id id id

    Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

    8

    Anlisis sintctico descendente

    + *

    E E

    E

    E

    E E-> id

    Introduccin (V)

    id id id

    Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

  • 59

    Anlisis sintctico descendente

    + *

    E E

    E

    E

    E E-> id

    Introduccin (VI)

    id id id

    Gramtica: E -> E + E E -> E * E E -> -E E -> (E) E -> id

    10

    En las tcnicas vistas hasta ahora (ascendentes) siempre se ha sabido en cada circunstancia qu regla de la gramtica utilizar (reducir)

    En las tcnicas descendentes se tiene el mismo problema: hay que asegurarse de que siempre se conoce qu regla de la gramtica aplicar en funcin del smbolo de la entrada que se est analizando y el estado del anlisis en el que nos encontremos

    Una aproximacin simple e intuitiva al anlisis descendente puede abordar este problema probando reglas y, en caso de no poder aplicar ms para analizar la cadena de entrada, volver hacia atrs para probar otras (backtracking).

    Sin embargo, usar backtracking es poco eficiente, por lo que la tcnica descendente ms importante que veremos es la LL(1):

    Con procesamiento Left-To-Right (como los analizadores que ya hemos visto). Expandiendo el smbolo no terminal ms a la izquierda (Leftmost) primero. Requiere que la gramtica sea LL(1).

    Anlisis sintctico descendenteIntroduccin (VII)

  • 611

    8.2

    Anlisis descendente conbacktracking (o con vuelta a atrs)

    12

    Podramos considerar el anlisis sintctico top-down con vuelta atrs lenta como un caso particular de bsqueda ciega en profundidad (se desempata de izquierda a derecha)

    El criterio para decidir si una regla es aplicable en una posicin es la coincidencia de esa posicin con el no terminal que est en la parte izquierda de la regla.

    No podemos continuar por un camino cuando tengamos terminales que discrepen con el programa (podemos suponer el orden de recorrido natural del programa (de izquierda a derecha)

    Habremos terminado el proceso en dos situaciones: Si el rbol de derivacin se cierra porque se ha llegado a eliminar todos los no

    terminales y se obtiene la misma secuencia de terminales del programa. En este caso se ha construido un rbol sintctico para el programa que resulta ser correcto

    Si no se ha podido cerrar el rbol de derivacin pero se han probado todas las reglas en cada posicin y no se puede aplicar ninguna otra opcin. En ese caso se ha demostrado que el programa es sintcticamente incorrecto.

    Anlisis sintctico descendenteTop-down con vuelta atrs lenta: conceptos

  • 713

    1. Smbolo actual = axioma2. Encontrar las reglas que expanden el smbolo actual.3. Si slo hay una regla, aplicarla.4. Si hay varias reglas, aplicar la primera y mantener las otras en reserva.5. Por cada smbolo de la parte derecha de la regla, repetir desde el paso 2.6. Cuando el anlisis falle porque la regla requiere que el siguiente smbolo de

    la entrada sea un cierto terminal pero no lo es, o la expansin del axioma es correcta pero no cubre toda la cadena de entrada:1. Deshacer la aplicacin de esta regla.2. Volver al punto de eleccin de la regla.3. Elegir la siguiente alternativa.

    7. El anlisis termina con xito si:1. Se pueden generar todos los smbolos terminales de la cadena de

    entrada a partir de la expansin de los no terminales.2. No se puede analizar la cadena/programa de entrada puesto que es

    invlida y aunque se han intentado probar todas las reglas en cada paso, no hay ninguna derivacin posible.

    Anlisis sintctico descendenteTop-down con vuelta atrs lenta: algoritmo

    14

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iEE

    - E

    E

    - E

    Ejemplos previos

  • 815

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iEE

    - E

    E

    i

    Ejemplos previos

    16

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iEE

    - E

    E

    i

    Ejemplos previos

  • 917

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iE

    - E

    E

    i- E

    E

    Ejemplos previos

    18

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iE

    - E

    E

    i- E

    E

    Ejemplos previos

  • 10

    19

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iE

    - E

    E

    i- E

    E

    - E

    Ejemplos previos

    20

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iE

    - E

    E

    i- E

    E

    - E

    - E

    Ejemplos previos

  • 11

    21

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iE

    - E

    E

    i- E

    E

    - E

    - E

    E

    - E

    Ejemplos previos

    22

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iE

    - E

    E

    i- E

    E

    - E E

    - Ei

    Ejemplos previos

  • 12

    23

    i+--i

    Anlisis top-down, vuelta atrs lenta

    G=

    E E

    - E+

    E

    iE

    - E

    E

    i- E

    E

    - E E

    - Ei

    ACEPTADA

    Ejemplos previos

    24

    i++i

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

  • 13

    25

    i++i

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    - E

    26

    i++i

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    - E

    E

    - E

  • 14

    27

    i++i

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - Ei

    28

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    i

    E

    - E

    E

    i

    i++i

  • 15

    29

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E E

    30

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E E

    - E

  • 16

    31

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E E

    - E

    E

    - E

    32

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i

  • 17

    33

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i

    34

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i- E

    E

    - E

  • 18

    35

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i i

    E

    - E

    36

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i i

    E

    - E

    E

    i

  • 19

    37

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i

    E

    - E

    E

    i+E E

    38

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i

    E

    - E

    E

    i+E E

    - E

  • 20

    39

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i

    E

    - E

    E

    i+E E

    - E

    E

    - E

    40

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i

    E

    - E

    E

    i+E E

    i

    E

    - E

  • 21

    41

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i

    E

    - E

    E

    i+E E

    i

    E

    - E

    E

    i

    42

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i

    E

    - E

    E

    i+E EE

    - E

    E

    i +E E

  • 22

    43

    Anlisis top-down, vuelta atrs lenta

    Considerar el anlisis para i++i

    G=

    E

    Ejemplos previos

    E

    - E

    E

    i

    i++i

    +E EE

    - E i

    E

    - E

    E

    i+E EE

    - E

    E

    i +E E

    E

    +E E

    E

    - E

    E

    i

    BUCLE

    44

    Como el alumno habr observado, la presencia en la gramtica de reglas recursivas por la izquierda hace que este tipo de anlisis encuentre bucles infinitos de los que no puede salir.

    Hay maneras de solucionar este problema (entre otros) y construir analizadores sintcticos descendentes. Este tipo de analizadores suele llamarse LL(k)

    Uno de los objetivos de este tema es demostrar que se pueden construir fcilmente analizadores de tipo LL(1) (la entrada se lee desde la izquierda left las derivaciones en el rbol se hacen de izquierda left a derecha y se necesita conocer slo 1 smbolo de la entrada por anticipado) si la gramtica se puede expresar en forma adecuada

    Anlisis top-down, vuelta atrs lentaConclusiones

  • 23

    45

    8.3

    Anlisis descendente determinista:LL(1) (sin vuelta atrs)

    46

    Anlisis top-down selectivoConcepto

    Tambin se llama sin vuelta atrs, en oposicin a la tcnica descrita al principio del tema.

    Tambin se llama descenso recursivo por la tcnica de paso automtico de la gramtica LL(1) al analizador.

    Intuitivamente, la razn de su eficiencia reside en que las partes derechas de cada no terminal pueden considerarse indexadas por el siguiente terminal.

    De hecho con LL(1) se puede construir una tabla de doble entrada (no terminales / terminales ) en la que, cada celda, est ocupada solamente por una regla que es la nica opcin que se puede aplicar cuando en el rbol sintctico corresponda tratar el no terminal y en el recorrido del programa toque tratar el terminal.

  • 24

    47

    8.3.1

    Gramtica LL(1) mediante la construccinde la tabla de anlisis descendente

    48

    Anlisis LL(1) con tabla de anlisisAlgoritmo de clculo

    Describiremos ahora el algoritmo de clculo de la tabla de anlisis TM|N||T|+1 (matriz con una filas para los no terminales y columnas para los terminales aadiendo el delimitador $):

    Se aplica los siguientes pasos1. AP realizar el proceso

    1. aprimero()T A T[A,a].2. Si primero() Entonces bsiguiente(A) A T[A,b] (obsrvese que b

    puede ser tambin $)

  • 25

    49

    Anlisis LL(1) con tabla de anlisisEjemplos

    En la gramtica de los ejemplos anteriores

    G=

    primero(E)= {i,(}primero(E)= {+,}primero(T)= {i,(}primero(T)= {*,}primero(F)= {i,(}siguiente(E)= {),$}siguiente(E)={),$}siguiente(T)= {),$,+}siguiente(T)={),$,+}siguiente(F)= {),$,+,*}

    50

    Anlisis LL(1) con tabla de anlisisEjemplos

    En la gramtica de los ejemplos anteriores

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

  • 26

    51

    Anlisis LL(1) con tabla de anlisisEjemplos

    Dada la siguiente gramtica

    G=< {P,P,E},{i,t,a,e,b}{ P iEtPP | a

    P eP | E b

    P>

    primero(P)= {i,a}primero(P)= {,e}primero(E)= {b}siguiente(P)= {$,e}siguiente(P)={$,e}siguiente(E)= {t}

    52

    Anlisis LL(1) con tabla de anlisisEjemplos

    Puede obtenerse la siguiente tabla

    EbE

    PppeP

    p

    PiEtPPPaP

    $tieba

    T{$}N

  • 27

    53

    Anlisis LL(1) con tabla de anlisisDefinicin

    Podemos definir las gramticas LL(1) como aqullas que cumplen

    Que la tabla de anlisis construida con el algoritmo explicado anteriormente es determinista (todas las casillas tienen, a lo ms, una regla)

    Ejemplos Es fcil deducir que

    La gramtica del primer ejemplo de tabla es LL(1) La segunda no lo es.

    54

    8.3.2

    Uso de la tabla de anlisis descendente

  • 28

    55

    Anlisis LL(1) con tabla de anlisisAlgoritmo de anlisis

    A partir de la tabla de anlisis puede utilizarse el siguiente algoritmo

    AnalisisLL(1)(char * cadena.$){char * simbolo_actual;pila pila_analisis;

    simbolo_actual = cadena;push( pila_analisis, $);push( pila_analisis, S ); /* S es el axioma */while (cima(pila_analisis) != $) {

    if ( terminal(cima(pila_analisis)) || cima(pila_analisis) == $ )if ( cima(pila_analisis) == *simbolo_actual ) {

    pop(pila_analisis); simbolo_actual++; }else salir_error();

    elseif ( M[cima(pila_analisis), *simbolo_actual] != null) {

    pop( pila_analisis );push_cadena(*)(

    pila_analisis, reverse( parte_derecha(M[cima(pila_analisis), *simbolo_actual]) ) );

    else salir_error();}

    }(*) push_cadena(pila, cadena) inserta en la pila una cadena

    56

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $E

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 29

    57

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $E

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    58

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 30

    59

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    60

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 31

    61

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $E

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    62

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ETF

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 32

    63

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    64

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ETid

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 33

    65

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    66

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $E

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 34

    67

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET+

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    68

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 35

    69

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $E

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    70

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ETF

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 36

    71

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    72

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ETid

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 37

    73

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    74

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $E

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 38

    75

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ETF*

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    76

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ETF

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 39

    77

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    78

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ETid

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 40

    79

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $ET

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    80

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $E

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

  • 41

    81

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    82

    Anlisis LL(1) con tabla de anlisis

    $id*id+id

    $

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Cadena aceptada

    Ejemplo

  • 42

    83

    Anlisis LL(1) con tabla de anlisis

    $id+

    $E

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    Ejemplo

    84

    Anlisis LL(1) con tabla de anlisis

    $id+

    $E

    F(E)FidFTTT*FTTT

    TFTTFTT

    EEE+TEEETEETEE

    $)(*+idT{$}N

    salir_error(): cadena rechazadaEjemplo

  • 43

    85

    Anlisis sintctico

    [Alf] Teora de Autmatas y lenguajes formales M. Alfonseca y otros[Hop] Introduccin a la teora de autmatas, lenguajes y computacin Hopcroft, J.;

    Motwani, R.; Ullman, J.[Aho] Compiladores. Principios, tcnicas y herramientas A. V. Aho; R. Sefthi; J. D.

    Ullman

    Bibliografa