Método de principio de compilación de principio a fin para eliminar la ambigüedad y la recursividad por la izquierda


Prefacio

El lenguaje es cumplir con ciertas reglas de composición de una colección de oraciones, oraciones que cumplen con ciertas reglas de composición secuencia de palabras, palabra es cumplir con ciertas reglas de composición de cadena. Estas reglas de composición son las producciones en la gramática.
El análisis de sintaxis es la parte central del compilador y su tarea consiste en verificar si la secuencia de palabras generada por el analizador léxico es una oración en el idioma de origen, es decir, si se ajusta a las reglas gramaticales del idioma de origen. Ya sea de arriba hacia abajo o de abajo hacia arriba, el analizador gramatical escanea la secuencia de palabras de entrada de izquierda a derecha, lee una palabra a la vez y crea un árbol de análisis gramatical para la secuencia de palabras de entrada.

1. Método de arriba a abajo

La idea básica del análisis gramatical de arriba hacia abajo :
comenzando por el símbolo inicial de la gramática, busque una derivación más a la izquierda de la cadena de símbolo de entrada dada. Es decir, a partir de la raíz S, construya un árbol de sintaxis de la cadena de símbolo de entrada dada.

Ejemplo: con

G: S → x A y, A → ∗ ∗ ∣ ∗, cadena de entrada: x ∗ ∗ y G: S → xAy, A → ** | *, cadena de entrada: x ** y G : Sx A y ,UN, Ingrese la cadena : Xy
se analiza como:
S → x A y → x ∗ ∗ y S → xAy → x ** ySx A yX∗ El
árbol de sintaxis y es:Árbol de sintaxis


2. Problemas de arriba hacia abajo

1. Ambigüedad

1.1 Definición de ambigüedad : para la gramática G, si hay una oración con dos o más árboles de análisis sintáctico en L (G), entonces se dice que G es ambigua. También se puede decir de manera equivalente: si hay una oración con dos o más derivaciones a la izquierda (o más a la derecha) en L (G), entonces G es una gramática ambigua.

1.2 Antecedentes del problema de ambigüedad : suponiendo que w ∈ L (G) y hay dos derivaciones más a la izquierda de w, al realizar un análisis gramatical de arriba hacia abajo de w, el programa de análisis gramatical no podrá determinar cuál de w es la más Derivar a la izquierda. Entonces la gramática tiene un problema de ambigüedad.

1.3 Ejemplo de problema bilateral :
假 Gramática establecida G Nyoshita:
G: E → id ∣ c ∣ E + E ∣ E - E ∣ E ∗ E ∣ E / E ∣ E ∗ ∗ E ∣ (E) G: E → id | c | E + E | E - E | E * E | E / E | E ** E | (E)GRAMO:miyo d c E+E E - E EE E / E EE ( E )
Según la gramática G, analiza las siguientes frases:

id 1 + c ∗ id 2 id1 + c * id2 yo d 1+Ci d 2
producirá dos árboles de sintaxis diferentes:
árbol de sintaxis uno:Inserte la descripción de la imagen de refrescos aquíárbol de sintaxis dos:
Inserte la descripción de la imagen aquí

2. Soluciones a los problemas de ambigüedad

Solución 1: Gramática modificada, pull-in Nueva gramática Gramática
general transformada G G: E → id ∣ c ∣ E + E ∣ E - E ∣ E ∗ E ∣ E / E ∣ E ∗ ∗ E ∣ (E) G: E → id | c | E + E | E - E | E * E | E / E | E ** E | (E)GRAMO:miyo d c E+E E - E EE E / E EE ( E ) se
transforma en:

 G:    E → E+T | E-T| T
		T → T*F | T/F | F
		F → F↑P | P 
		P → c | id | (E)  

Solución 2: De acuerdo con la relación de prioridad, asegurar el principio de prioridad de los operadores de alta prioridad.

3. Problema de recursividad izquierda

3.1 Definición de recursividad por la izquierda : si hay una derivación A -> αAβ, entonces se dice que la gramática G es recursiva, y cuando α = ε, se llama recursión por la izquierda.
Suplemento: Si A -> αAβ requiere al menos dos derivaciones, entonces la gramática G se llama recursión indirecta. Cuando α = ε, se llama recursión indirecta por la izquierda; si hay una fórmula de producción de la forma A -> αAβ en la gramática G, entonces La gramática G se llama recursividad directa, cuando α = ε, se llama recursión directa a la izquierda.

3.2 El trasfondo del problema de recursividad a la izquierda : cuando el primer símbolo no terminal a la derecha de la producción es el símbolo no terminal a la izquierda de la producción, se producirá el problema de recursividad a la izquierda.

3.3 Ejemplos de problemas de recursividad directa por la izquierda :
Ejemplo: Problemas de derivación infinita causados ​​por la recursividad por la izquierda:

  Ger:	E→E+T   
		E→T   
		T→F   
		T→T*F    
		F→(E)   
		F→id 

Considere la posibilidad de crear una derivación más a la izquierda para la cadena de entrada id + id * id:
cuando se establece la derivación más a la izquierda, cuando la derivación llega a E o T, se genera una recursión a la izquierda, lo que conduce a una derivación infinita.

3.4 Ejemplo de
recursión indirecta por la izquierda : un ejemplo de recursión indirecta por la izquierda:

     S → Ac | c
     A → Bb | b
     B → Sa | a

4. La solución al problema de recursividad por la izquierda

4.1 Solución recursiva directa a la izquierda :

Paso 1: Eliminación directa de la recursión izquierda (convertir a recursión derecha)
Paso 2: Introduzca una nueva variable A ', reemplace la producción recursiva izquierda A → Aα | β con A → βA' A '→ αA' ​​| ε
arriba El ejemplo se resuelve según la solución:

Inserte la descripción de la imagen aquí
4.2 Solución recursiva izquierda indirecta :

La idea básica de eliminar la recursividad indirecta por la izquierda : 1. Numere las variables gramaticales, 2. Luego use el método de entrada para convertir la recursión indirecta por la izquierda en una recursión directa por la izquierda, 3. Luego use el método anterior para eliminar la recursión directa por la izquierda.
paso:

1.将G的所有语法变量排序(编号),假设排序后的语法变量记为A1,A2,…,An;
2for i←1 to n {
    
    
3for j←1 to i-1 {
    
    
4.        对每个形如Ai→Ajβ的产生式,其中,Aj→α1|α2||αk是
           所有当前Aj产生式,用产生式Ai→α1β|α2β||αkβ替换
5}
6.     消除Ai产生式中的所有直接左递归
7} 

Análisis de pseudocódigo: Cuando
i = 1, el cuerpo del bucle de las líneas 3-5 no se ejecuta. En este momento, se ejecuta la operación de eliminación de recursividad izquierda en la línea 6, que elimina la recursividad directa izquierda de todas las variables A1.
En este momento, todo A1 tiene A1 → Una producción en forma de Abα debe tener b> 1.

Mirando i = 2, el elemento más a la izquierda a la derecha de A2 es una variable. La forma de producción puede ser A2 → A1α | A2β | A3γ | ... Se
sabe que el elemento actual más a la izquierda a la derecha de A1 es una variable. La forma de producción es A1 → A2α '| A3β' | ……
Después de la operación de reemplazo en la línea 4, todas las producciones de A2 tienen la forma de A2 → Abα, y se debe encontrar b> = 2.
Después de ejecutar la recursión izquierda directa de eliminación en la línea 6, todas las producciones en forma de A2 → Abα en A2 deben tener b> 2.

i = 3, el elemento más a la izquierda a la derecha de A3 es una variable. La forma de producción puede ser A3 → A1α | A2β | A3γ | ... Se
sabe que el elemento actual más a la izquierda a la derecha de A1 es una variable. La forma de producción es A1 → A2α '| A3β' | ……,
el elemento más a la izquierda a la derecha del A2 actual es una variable. La forma de producción es A2 → A3α '| A4β' | ……
Después de la operación de reemplazo en la cuarta línea, todo A3 tiene A3 Una producción en forma de Abα debe tener b> = 3.
Después de ejecutar la recursión izquierda directa de eliminación en la línea 6, todas las producciones en forma de A3Abα deben tener b> 3.

Por analogía, i = n, después de la operación de reemplazo en la línea 4, todas las producciones de An tienen la forma de An → Abα, y b> = n debe estar allí.
Después de ejecutar la recursividad directa izquierda de eliminación en la línea 6, todas las producciones de An con la forma de An → Abα deben tener b> n. En otras palabras, se ha eliminado la recursividad por la izquierda.

La explicación detallada de los pasos de eliminación para el ejemplo de recursión izquierda indirecta anterior es:

     S → Ac | c
     A → Bb | b
     B → Sa | a

Orden de las variables de sintaxis: cuando B, A, S
i = 1, B → Sa | a no tiene recursión directa a la izquierda; cuando
i = 2, A → Bb | b, get después de sustituir la variable B, A → Sab | ab | b;
i = 3, S → Ac | c, reemplace la variable A para obtener S → Sabc | abc | bc | c;
luego realice la operación de eliminación directa recursividad izquierda.

5. Problemas de retroceso

5.1 Definición del problema de retroceso : las producciones gramaticales Una parte derecha de cada sintaxis referida Una variable del tipo candidato . Si hay varios candidatos para A con un prefijo común , el analizador de arriba hacia abajo no podrá seleccionar con precisión la producción utilizada para la derivación de acuerdo con los símbolos de entrada actuales, y solo puede probar. Cuando la prueba no tiene éxito, debe volver al paso anterior de derivación para ver si hay otros candidatos para A. Esto es retroceder.

5.2 Ejemplos de problemas de retroceso :
Existe la siguiente gramática G:

Ge:	E→T   
    	E→E+T   
		E→E-T   
 		T→F   
 		T→T*F   
		T→T/F  
		F→(E)   
		F→id 

Considere establecer la derivación más a la izquierda para la cadena de entrada id + id * id:
en el proceso de derivación, debido a que se usa el análisis gramatical de arriba hacia abajo, se juzga que E adopta E → ET. Si no es posible, entonces debe retroceder hasta que se encuentre E. → Producción E + T.

6. Soluciones de problemas de retroceso

6.1 La solución al problema de retroceso utiliza el método de extraer el factor izquierdo para transformar la gramática con el fin de reducir la ocurrencia de retroceso en el proceso de derivación. Por supuesto, simplemente extraer el factor izquierdo no puede evitar por completo el fenómeno de retroceso.

Inserte la descripción de la imagen aquí


para resumir

Los requisitos gramaticales para el análisis descendente se determinan de la siguiente manera:

  1. Inequívoco
  2. Sin recursividad a la izquierda;
  3. El primer terminador que puede derivarse de cada candidato de cualquier variable gramatical A debe ser diferente.
  4. Enlace: Principios de Compilación-Definición y Clasificación de Gramática .
  5. Enlace: Principio de compilación-conversión entre gramática regular y expresión regular .

Supongo que te gusta

Origin blog.csdn.net/weixin_43824348/article/details/111590542
Recomendado
Clasificación