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
G = (V, T, P, S)
V : conjunto de variables (no terminales)
T : conjunto de terminales
P : conjunto de producciones
S : variable de inicioTenga 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.
Árbol de derivación para aaabbb
Ejemplo 2
aabbbb
La primera forma de pensar puede ser considerar aabb como un todo y agregar algo de bb detrás de él.
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.
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 aSbbbb, y sensible al contexto es aSb 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 + identEstas 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|identOp → + |- | * | /
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érminoTé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érminoTérmino → Término * Factor | Término / Factor | Factor
Factor → ident | si ( Expr )