int v;main(){
" y está a punto de elegir una regla para derivar el no terminal " Stmt
". Al observar únicamente el primer token de anticipación " v
", no puede decidir cuál de ambas alternativas Stmt
elegir para " ", ya que son posibles dos continuaciones de entrada. Se pueden discriminar mirando la segunda ficha 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 , que analiza la entrada de izquierda a derecha y construye una derivación más a la izquierda de la oración (de ahí que LL, en comparación con el analizador LR que construye una derivación más a la derecha). Un idioma que tiene una gramática LL se conoce como idioma LL . Estos forman subconjuntos de gramáticas deterministas libres de contexto (DCFG) y lenguajes deterministas libres de contexto (DCFL), respectivamente. Se dice que una gramática o un idioma determinado "es una gramática/lenguaje LL" o simplemente "es LL" para indicar que está en esta clase.
Los analizadores LL son analizadores basados en tablas, similares a los analizadores LR. Alternativamente, las gramáticas LL se pueden caracterizar precisamente como aquellas que pueden ser analizadas por un analizador predictivo (un analizador de descenso recursivo sin retroceso ) y que pueden escribirse fácilmente a mano. Este artículo trata sobre las propiedades formales de las gramáticas LL; para el análisis, consulte Analizador LL o analizador de descenso recursivo .
Dado un número natural , una gramática libre de contexto es una gramática LL(k) si
hay como máximo una regla de producción tal que para algunas cadenas de símbolos terminales ,
Una definición formal alternativa, pero equivalente, es la siguiente: es una gramática LL(k) si, para derivaciones arbitrarias
cuando los primeros símbolos de concuerdan con los de , entonces . [3] [4]
De manera informal, cuando un analizador ha derivado , con su no terminal más a la izquierda y ya consumido de la entrada, al observarlo y observar los siguientes símbolos de la entrada actual, el analizador puede identificar con certeza la regla de producción para .
Cuando la identificación de reglas es posible incluso sin considerar la entrada pasada , 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 for se omite y se agrega al cuantificador "para algunos" for . 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 alguna m . [8]
Cada gramática LL( k ) es también una gramática LR( k ). Una gramática LL(1) libre de ε también es una gramática SLR(1). Una gramática LL(1) con símbolos que tienen derivaciones vacías y no vacías también es una gramática LALR(1). Una gramática LL(1) con símbolos que solo tienen la derivación vacía puede ser LALR(1) o no. [9]
Las gramáticas LL no pueden tener reglas que contengan recursividad hacia la izquierda . [10] Cada gramática LL( k ) que es libre de ε se puede transformar en una gramática LL( k ) equivalente en forma normal de Greibach (que por definición no tiene reglas con recursividad hacia la izquierda). [11]
Sea un alfabeto terminal. Una partición de se llama partición regular si para cada uno el lenguaje es regular.
Sea una gramática libre de contexto y una partición regular de . Decimos que es una gramática LL( ) si, para derivaciones arbitrarias
tal que se deduce que . [12]
Se dice que una gramática G es LL-regular (LLR) si existe una partición regular tal que G sea LL( ). Un lenguaje es LL-regular si es generado por una gramática LL-regular.
Las gramáticas LLR son inequívocas y no pueden ser recursivas a la izquierda.
Cada 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 , una gramática determinada es LL( ). Sin embargo, no se puede decidir si una gramática arbitraria G es LLR. Esto se debe al hecho de que decidir si una gramática G genera un lenguaje regular, lo cual sería necesario para encontrar una partición regular para G , puede reducirse al problema de correspondencia postal .
Cada gramática LLR es LR-regular (LRR, el equivalente [ aclarar ] 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 siguieron a 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 de derecha a izquierda, identificando instancias de producciones regulares. Una vez hecho esto, un analizador LL(1) es suficiente para manejar la entrada transducida en tiempo lineal. Por lo tanto, los analizadores LLR pueden manejar una clase de gramáticas estrictamente más grande que los analizadores LL( k ) y al mismo tiempo son igualmente eficientes. A pesar de eso, la teoría de LLR no tiene aplicaciones importantes. Una razón posible y muy plausible es que, si bien existen algoritmos generativos para los analizadores LL( k ) y LR( k ), el problema de generar un analizador LLR/LRR es indecidible a menos que se haya construido una partición regular por adelantado. Pero incluso el problema de construir una partición regular adecuada dada una gramática es indecidible.
Una gramática libre de contexto se llama determinista simple , [14] o simplemente simple , [15] si
Un conjunto de cadenas se denomina lenguaje determinista simple, o simplemente simple, si tiene una gramática determinista simple.
La clase de lenguajes que tienen 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 lenguaje incluye los conjuntos regulares que no contienen ε. [15] La equivalencia es decidible para él, mientras que la inclusión no lo es. [14]
Las gramáticas LL, particularmente 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 de descenso recursivo, y muchos lenguajes informáticos [ aclarar ] están diseñados para ser LL(1) para esto. razón. Los lenguajes basados en gramáticas con un valor alto de k tradicionalmente se han considerado [ cita necesaria ] difíciles de analizar, aunque esto es menos cierto ahora dada la disponibilidad y el uso generalizado [ cita necesaria ] de generadores de analizadores que admiten gramáticas LL ( k ) para arbitrario k .
{{cite journal}}
: Citar diario requiere |journal=
( ayuda )