Compilador: gramática libre de contexto

gramáticas libres de contexto gramática libre de contexto
Esto se utiliza para analizar (análisis sintáctico)

El lenguaje que pueden reconocer los autómatas finitos se llama lenguaje regular,
lenguaje libre de contexto, incluido el lenguaje regular.

Por ejemplo, los siguientes idiomas no tienen contexto pero no son regulares 

L = \izquierda \{ a^nb^n |  n\geq 0\derecha \}

S\rightarrow aSb |  \epsilon

 G = (V, T, P, S)

V : conjunto de variables (no terminales)
T : conjunto de terminales
P : conjunto de producciones
S : variable de inicio

Tenga en cuenta que V, T, P y S aquí solo representan los cuatro tipos en la gramática. 
Por ejemplo, la siguiente gramática de tres líneas  S1 debe reemplazarse más adelante, por lo que la b en la tercera línea de la variable no terminal V no necesita ser reemplazado. Los reemplazos posteriores pertenecen a la variable de terminación T. Hay tres líneas en total, por lo que hay tres resultados de salida P. S es la posición inicial, que es la S en la imagen de arriba  ⚠️: Las letras en La sintaxis no es fija y se puede utilizar cualquier letra. 
\\S \rightarrow S1S2 \\S1 \rightarrow aS1b |  \epsilon \\S2 \rightarrow bS2 |  b




Árbol de derivación para aaabbb

 Ejemplo 2

L2 = \izquierda \{a^nb^m |  n\geq 0,m> n \right \}

 aabbbb
La primera forma de pensar puede ser considerar aabb como un todo y agregar algo de bb detrás de él.
\\S \rightarrow S1S2 \\S1 \rightarrow aS1b |  \epsilon \\S2 \rightarrow bS2 |  b

aabbbb

La segunda forma de pensar es considerar bb como el centro de toda la cadena. Si el número de a y b es igual, es ab. Pero cuando el número de b es mayor que a, la parte central sólo debe contener b.

\\S \rightarrow aSb |  B \\B \rightarrow bB |  b

libre de contexto: libre
de contexto sensible al contexto:
sensible al contexto Entonces, la diferencia entre libre de contexto y sensible al contexto:
solo hay una variable a la izquierda de libre de contexto, que es S  \flecha correcta aSbbbb, y sensible al contexto es aSb \flecha correcta aSbbbb, que tiene variables a la izquierda y terminal

∑ = {ident,num,si,si no,+,-,……}

En términos generales, en la etapa de análisis léxico, usaremos una cadena como entrada al escáner, y luego el escáner juzgará si es una variable, un número, un carácter especial, un símbolo de asignación, etc. En los lenguajes de alto nivel, utilizamos el nombre de la variable (
identificador). Esta clase es un símbolo en la tabla del lenguaje informático. En el proceso de escaneo (análisis léxico), sin duda pasa una cadena y devuelve una categoría. Combina varias categorías para forme un lenguaje libre de contexto y luego use una gramática específica Definición de gramática para juzgar si este conjunto de combinaciones de categorías se ajusta a la gramática especificada. Si no cumple, se producirá un error de compilación.

x12 = abc + def;
mira la categoría aquí es ident = ident + ident; es decir, ident = Expr;

Asignar → ident = Expr;
Expr → ident + ident 

Estas dos líneas de sintaxis pueden admitir la línea de código anterior, pero no son universales y solo se limitan al código anterior.

//Descubrimos que el código anterior solo puede realizar sumas y este Expr solo admite dos identificadores, por lo que lo modificamos para hacerlo más general
 Assign → ident = Expr;
Expr → Expr Op ident|ident

Op → + |- | * | /

Usemos un ejemplo para demostrar el árbol de análisis (árbol de análisis sintáctico)
⚠️: el árbol de análisis lo convertiremos en AST más adelante: árbol de sintaxis abstracta (árbol de sintaxis abstracta) y luego AST se convertirá en IR: representación intermedia
x = a + segundo *c;

 Sin embargo, encontramos que todavía hay un problema. En la actualidad, según esta gramática, primero se realiza la operación de suma y luego la operación de multiplicación. Esto obviamente no es lógico según las reglas matemáticas y es necesario mejorar la gramática.

x = a + b * c;
en matemáticas llamamos a a o b*c un término, y b o c en b*c se llama factor

Asignar → ident = Expr;
Expr → Expr + Término | Expr - Plazo | Término

Término → Término * Factor | Término / Factor | Factor

Factor → ident | si

 

 El árbol de análisis comienza desde abajo y sube. Puede ver que la multiplicación * está debajo del signo más + 

Pero ¿qué pasa con x = (a + b) * c - d;?
En este momento en matemáticas (a + b) es un factor c también es un factor (a + b) * c es un término
para formar la versión última

Gramática de expresiones clásicas:

Asignar → ident = Expr;
Expr → Expr + Término | Expr - Plazo | Término

Término → Término * Factor | Término / Factor | Factor

Factor → ident | si ( Expr )

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43754049/article/details/126245606
Recomendado
Clasificación