Articulo de referencia

Gramática LL

La gramática C [ 1 ] no es LL(1): La parte inferior muestra un analizador que ha procesado los tokens " int v;main(){ " y está a punto de elegir una regla para derivar el no ter...

La gramática C [ 1 ] no es LL(1): La parte inferior muestra un analizador que ha procesado los tokens " int v;main(){" y está a punto de elegir una regla para derivar el no terminal " Stmt". Mirando solo el primer token de anticipación " v", no puede decidir cuál de las dos alternativas para " Stmt" elegir, ya que son posibles dos continuaciones de entrada. Se pueden distinguir mirando el segundo token de anticipación (fondo amarillo).

En la teoría del lenguaje formal , una gramática LL es una gramática libre de contexto que puede ser analizada por un analizador LL , el cual analiza la entrada de izquierda a derecha y construye una derivación más a la izquierda de la oración (de ahí el término LL, en comparación con el analizador LR que construye una derivación más a la derecha). Un lenguaje que posee una gramática LL se conoce como lenguaje LL . Estos forman subconjuntos de las gramáticas libres de contexto deterministas (DCFG) y los lenguajes libres de contexto deterministas (DCFL), respectivamente. Se dice que una gramática o lenguaje dado "es una gramática/lenguaje LL" o simplemente "es LL" para indicar que pertenece a esta clase.

Los analizadores LL son analizadores basados ​​en tablas, similares a los analizadores LR. Las gramáticas LL también pueden caracterizarse como aquellas que pueden ser analizadas por un analizador predictivo (un analizador descendente recursivo sin retroceso ), y estas pueden escribirse fácilmente a mano. Este artículo trata sobre las propiedades formales de las gramáticas LL; para el análisis sintáctico, consulte Analizador LL o Analizador descendente recursivo .

Definición formal

Caso finito

Dado un número naturalk0{\displaystyle k\geq 0}, una gramática libre de contextoGRAMO=(V,Σ,R,S){\displaystyle G=(V,\Sigma,R,S)} es una gramática LL(k) si

  • para cada cadena de símbolos terminaleswΣ{\displaystyle w\in \Sigma ^{*}}de longitud hastak{\displaystyle k}símbolos,
  • para cada símbolo no terminalAV{\displaystyle A\in V}, y
  • para cada cadena de símbolos terminalesw1Σ{\displaystyle w_{1}\en \Sigma ^{*}},

Existe como máximo una regla de producción.rR{\displaystyle r\in R}de tal manera que para algunas cadenas de símbolos terminalesw2,w3Σ{\displaystyle w_{2},w_{3}\in \Sigma ^{*}},

  • la cuerdaw1Aw3{\displaystyle w_{1}Aw_{3}}puede derivarse del símbolo inicialS{\displaystyle S},
  • w2{\displaystyle w_{2}}puede derivarse deA{\displaystyle A}después de aplicar primero la reglar{\displaystyle r}, y
  • la primerak{\displaystyle k}símbolos dew{\displaystyle w}y dew2w3{\displaystyle w_{2}w_{3}}De acuerdo. [ 2 ]

Una definición formal alternativa, pero equivalente, es la siguiente: GRAMO=(V,Σ,R,S){\displaystyle G=(V,\Sigma,R,S)}es una gramática LL(k) si, para derivaciones arbitrarias

SLw1Aχw1νχw1w2w3SLw1Aχw1ωχw1w2w3,{\displaystyle {\begin{array}{cccccc}S&\Rightarrow ^{L}&w_{1}A\chi &\Rightarrow &w_{1}\nu \chi &\Rightarrow ^{*}&w_{1}w_{2}w_{3}\\S&\Rightarrow ^{L}&w_{1}A\chi &\Rightarrow &w_{1}\omega \chi &\Rightarrow ^{*}&w_{1}w'_{2}w'_{3},\\\end{array}}}

cuando el primerok{\displaystyle k}símbolos dew2w3{\displaystyle w_{2}w_{3}}estoy de acuerdo con los dew2w3{\displaystyle w'_{2}w'_{3}}, entoncesν=ω{\displaystyle \nu =\omega }. [ 3 ] [ 4 ]

De manera informal, cuando un analizador sintáctico se ha derivadow1Aw3{\displaystyle w_{1}Aw_{3}}, conA{\displaystyle A}su no terminal más a la izquierda yw1{\displaystyle w_{1}}ya consumido de la entrada, entonces al mirar esow1{\displaystyle w_{1}}y echando un vistazo al siguientek{\displaystyle k}símbolosw{\displaystyle w}A partir de la entrada actual, el analizador puede identificar con certeza la regla de producción.r{\displaystyle r}paraA{\displaystyle A}.

Cuando la identificación de reglas es posible incluso sin considerar la entrada anteriorw1{\displaystyle w_{1}}, entonces la gramática se denomina gramática LL(k) fuerte . [ 5 ] En la definición formal de una gramática LL( k ) fuerte , el cuantificador universal paraw1{\displaystyle w_{1}}se omite yw1{\displaystyle w_{1}}se agrega al cuantificador "para algunos" paraw2,w3{\displaystyle w_{2},w_{3}}Para cada gramática LL( k ), se puede construir una gramática LL( k ) fuerte estructuralmente equivalente . [ 6 ]

La clase de lenguajes LL( k ) forma una secuencia estrictamente creciente de conjuntos: LL(0) ⊊ LL(1) ⊊ LL(2) ⊊ …. [ 7 ] Es decidible si una gramática dada G es LL( k ), pero no es decidible si una gramática arbitraria es LL( k ) para algún k . También es decidible si una gramática LR( k ) dada es también una gramática LL( m ) para algún m . [ 8 ]

Toda gramática LL( k ) es también una gramática LR( k ). Una gramática LL(1) libre de ε es también una gramática SLR(1). Una gramática LL(1) con símbolos que tienen derivaciones tanto vacías como no vacías es también una gramática LALR(1). Una gramática LL(1) con símbolos que tienen solo la derivación vacía puede o no ser LALR(1). [ 9 ]

Las gramáticas LL no pueden tener reglas que contengan recursión izquierda . [ 10 ] Cada gramática LL( k ) que es ε-libre puede transformarse en una gramática LL( k ) equivalente en forma normal de Greibach (que por definición no tiene reglas con recursión izquierda). [ 11 ]

Caso regular

DejarΣ{\displaystyle \Sigma }ser un alfabeto terminal. Una particiónπ{\displaystyle \pi }deΣ{\displaystyle \Sigma ^{*}}Se denomina partición regular si para cadaRπ{\displaystyle R\in \pi }el idiomaR{\displaystyle R}es regular.

DejarGRAMO=(V,Σ,R,S){\displaystyle G=(V,\Sigma,R,S)}ser una gramática libre de contexto y dejarπ={R1,,Rnorte}{\displaystyle \pi =\{R_{1},\dotso ,R_{n}\}}ser una partición regular deΣ{\displaystyle \Sigma ^{*}}Decimos queGRAMO{\displaystyle G}es un LL(π{\displaystyle \pi }) gramática si, para derivaciones arbitrarias

SLw1Aχ1w1νχ1w1incógnitaSLw2Aχ2w2ωχ2w2y,{\displaystyle {\begin{array}{ccccccc}S&\Rightarrow ^{L}&w_{1}A\chi _{1}&\Rightarrow &w_{1}\nu \chi _{1}&\Rightarrow ^{*}&w_{1}x\\S&\Rightarrow ^{L}&w_{2}A\chi _{2}&\Rightarrow &w_{2}\omega \chi _{2}&\Rightarrow ^{*}&w_{2}y,\\\end{array}}}

de tal manera queincógnitaymodπ{\displaystyle x\equiv y\mod \pi }resulta queν=ω{\displaystyle \nu =\omega }. [ 12 ]

Se dice que una gramática G es LL-regular (LLR) si existe una partición regular deΣ{\displaystyle \Sigma ^{*}}tal que G es LL(π{\displaystyle \pi }Un lenguaje es LL-regular si es generado por una gramática LL-regular.

Las gramáticas LLR no son ambiguas y no pueden ser recursivas por la izquierda.

Toda gramática LL( k ) es LLR. Toda gramática LL( k ) es determinista, pero existe una gramática LLR que no es determinista. [ 13 ] Por lo tanto, la clase de gramáticas LLR es estrictamente mayor que la unión de LL( k ) para cada k .

Es decidible si, dada una partición regularπ{\displaystyle \pi }, una gramática dada es LL(π{\displaystyle \pi }Sin embargo, no es decidible si una gramática arbitraria G es LLR. Esto se debe a que decidir si una gramática G genera un lenguaje regular, lo cual sería necesario para encontrar una partición regular para G , se puede reducir al problema de correspondencia de Post .

Toda gramática LLR es LR-regular (LRR, el equivalente correspondiente para las gramáticas LR( k )), pero existe una gramática LR(1) que no es LLR. [ 13 ]

Históricamente, las gramáticas LLR surgieron tras la invención de las gramáticas LRR. Dada una partición regular, se puede construir una máquina de Moore para transducir el análisis sintáctico de derecha a izquierda, identificando instancias de producciones regulares. Una vez hecho esto, un analizador LL(1) es suficiente para procesar la entrada transducida en tiempo lineal. Por lo tanto, los analizadores LLR pueden manejar una clase de gramáticas estrictamente mayor que los analizadores LL( k ) con la misma eficiencia. A pesar de ello, la teoría LLR no tiene aplicaciones importantes. Una posible y muy plausible razón es que, si bien existen algoritmos generativos para analizadores LL( k ) y LR( k ), el problema de generar un analizador LLR/LRR es indecidible a menos que se haya construido previamente una partición regular. Pero incluso el problema de construir una partición regular adecuada dada la gramática es indecidible.

Lenguajes deterministas simples

Una gramática libre de contexto se llama determinista simple , [ 14 ] o simplemente simple , [ 15 ] si

  • está en forma normal de Greibach (es decir, cada regla tiene la formaZaY1Ynorte,norte0{\displaystyle Z\rightarrow aY_{1}\ldots Y_{n},n\geq 0}), y
  • diferentes lados derechos para el mismo no terminalZ{\displaystyle Z}Siempre comienza con terminales diferentes.a{\displaystyle a}.

Un conjunto de cadenas de caracteres se denomina lenguaje determinista simple, o simplemente lenguaje simple, si posee una gramática determinista simple.

La clase de lenguajes que poseen una gramática LL(1) libre de ε en forma normal de Greibach es igual a la clase de lenguajes deterministas simples. [ 16 ] Esta clase de lenguajes incluye los conjuntos regulares que no contienen ε. [ 15 ] La equivalencia es decidible para ella, mientras que la inclusión no lo es. [ 14 ]

Aplicaciones

Las gramáticas LL, en particular las gramáticas LL(1), son de gran interés práctico, ya que son fáciles de analizar, ya sea mediante analizadores LL o mediante analizadores descendentes recursivos, y muchos lenguajes de programación están diseñados para ser LL(1) por esta razón. Tradicionalmente, se ha considerado que los lenguajes basados ​​en gramáticas con un valor alto de k son difíciles de analizar, aunque esto es menos cierto ahora dada la disponibilidad y el uso generalizado de generadores de analizadores que admiten gramáticas LL( k ) para k arbitrario .

Véase también

Notas

  1. Kernighan y Ritchie 1988 , Apéndice A.13 "Gramática", pág. 193 y ss. La parte superior de la imagen muestra un extracto simplificado en una notación similar a la EBNF .
  2. Rosenkrantz y Stearns (1970 , p. 227) . Def.1. Los autores no consideran el caso k = 0. 
  3. donde "L{\displaystyle \Rightarrow ^{L}}" denota derivabilidad por derivaciones más a la izquierda, yw1,w2,w3,w2,w3Σ{\displaystyle w_{1},w_{2},w_{3},w'_{2},w'_{3}\in \Sigma ^{*}},AV{\displaystyle A\in V}, yχ,ν,ω(ΣV){\displaystyle \chi ,\nu ,\omega \in (\Sigma \cup V)^{*}}
  4. Waite & Goos (1984 , p. 123) Def.5.22  
  5. Rosenkrantz y Stearns (1970 , pág. 235) Def.2 
  6. Rosenkrantz y Stearns (1970 , p. 235) Teorema 2 
  7. Rosenkrantz y Stearns (1970 , págs. 246-247) : Usando " +{\displaystyle +}" para denotar "o", el conjunto de cadenas{anorte(bkd+b+dodo)norte:norte1}{\displaystyle \{a^{n}(b^{k}d+b+cc)^{n}:n\geq 1\}}tiene unLL(k+1){\displaystyle LL(k+1)}pero no libre de εLL(k){\displaystyle LL(k)}gramática, para cadak1{\displaystyle k\geq 1}.
  8. Rosenkrantz y Stearns (1970 , págs. 254-255) 
  9. Beatty (1982)
  10. Rosenkrantz y Stearns (1970 , pág. 241) Lema 5 
  11. Rosenkrantz y Stearns (1970 , pág. 242) Teorema 4 
  12. Poplawski, David (1977). "Propiedades de los lenguajes regulares LL". Universidad de Purdue.{{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  13. 1 2 David A. Poplawski (agosto de 1977). Propiedades de los lenguajes LL-regulares (Informe técnico). Universidad de Purdue , Departamento de Ciencias de la Computación.
  14. ^ Korenjak y Hopcroft (1966)
  15. 1 2 Hopcroft y Ullman (1979 , pág. 229) Ejercicio 9.3 
  16. Rosenkrantz y Stearns (1970 , pág. 243) 

Fuentes

  • Beatty, JC (1982). "Sobre la relación entre las gramáticas LL(1) y LR(1)" (PDF) . Journal of the ACM . 29 (4 (octubre)): 1007–1022 . doi : 10.1145/322344.322350 . S2CID 14700480 . 
  • Hopcroft, John E.; Ullman, Jeffrey D. (1979). Introducción a la teoría de autómatas, lenguajes y computación . Addison-Wesley. ISBN 978-0-201-02988-8.
  • Kernighan, Brian W.; Ritchie, Dennis M. (abril de 1988). El lenguaje de programación C. Serie de software de Prentice Hall (2.ª  ed.). Englewood Cliffs/NJ: Prentice Hall. ISBN 978-013110362-7.
  • Korenjak, AJ; Hopcroft, JE (1966). "Lenguajes deterministas simples". Actas de la 7.ª Conferencia Anual del IEEE sobre Teoría de Conmutación y Autómatas (SWAT) . Publicación del IEEE n.º vol.  16-C-40. págs. 36–46 . doi : 10.1109/SWAT.1966.22 . 
  • Parr, T.; Fisher, K. (2011). "LL(*): Los fundamentos del generador de analizadores sintácticos ANTLR" (PDF) . ACM SIGPLAN Notices . 46 (6): 425– 436. doi : 10.1145/1993316.1993548 .
  • Rosenkrantz, DJ; Stearns, RE (1970). "Propiedades de las gramáticas deterministas descendentes" . Information and Control . 17 (3): 226– 256. doi : 10.1016/s0019-9958(70)90446-8 .
  • Waite, William M.; Goos, Gerhard (1984). Construcción de compiladores . Textos y monografías en informática. Heidelberg: Springer. ISBN 978-3-540-90821-0.

Lecturas adicionales

  • Sippu, Seppo; Soisalon-Soininen, Eljas (1990). Teoría del análisis: análisis LR (k) y LL (k) . Medios de ciencia y negocios de Springer. ISBN 978-3-540-51732-0.