stringtranslate.com

Gramática de precedencia de operadores

Una gramática de precedencia de operadores es un tipo de gramática para lenguajes formales .

Técnicamente, una gramática de precedencia de operadores es una gramática libre de contexto que tiene la propiedad (entre otras) [1] de que ninguna producción tiene un lado derecho vacío o dos no terminales adyacentes en su lado derecho. Estas propiedades permiten definir relaciones de precedencia entre los terminales de la gramática. Un analizador sintáctico que explota estas relaciones es considerablemente más simple que los analizadores sintácticos de propósito general, como los analizadores sintácticos LALR . Se pueden construir analizadores sintácticos de precedencia de operadores para una gran clase de gramáticas libres de contexto.

Relaciones de precedencia

Las gramáticas de precedencia de operadores se basan en las siguientes tres relaciones de precedencia entre los terminales: [2]

Estas relaciones de precedencia de operadores permiten delimitar los manejadores en las formas oracionales correctas : marca el extremo izquierdo, aparece en el interior del manejador y marca el extremo derecho. A diferencia de otros analizadores sintácticos de desplazamiento-reducción, todos los no terminales se consideran iguales para el propósito de identificar manejadores. [3] Las relaciones no tienen las mismas propiedades que sus contrapartes sin punto; p. ej., no implica generalmente y no se sigue de . Además, no se cumple generalmente y es posible.

Supongamos que entre los terminales a i y a i +1 siempre hay exactamente una relación de precedencia. Supongamos que $ es el final de la cadena. Entonces, para todos los terminales b definimos: y . Si eliminamos todos los no terminales y colocamos la relación de precedencia correcta: , , entre los terminales restantes, quedan cadenas que pueden analizarse mediante un analizador sintáctico de abajo a arriba fácilmente desarrollado .

Ejemplo

Por ejemplo, se pueden introducir las siguientes relaciones de precedencia de operadores para expresiones simples: [4]

Se desprenden de los siguientes hechos: [5]

La cadena de entrada [4]

después de agregar marcadores finales e insertar relaciones de precedencia se convierte en

Análisis de precedencia de operadores

Tener relaciones de precedencia permite identificar identificadores de la siguiente manera: [4]

Generalmente no es necesario escanear toda la oración para encontrar el identificador.

Algoritmo de análisis de precedencia de operadores

El algoritmo que aparece a continuación es de Aho et al.: [6]

Si $ está en la parte superior de la pila e ip apunta a $, entonces devuelve else Sea a la terminal superior de la pila y b el símbolo al que apunta ip. Si es  a  b o a b entonces empuja b a la pila       Avanzar ip al siguiente símbolo de entrada De lo contrario, si es  a  , entonces repita    revienta la pila hasta que la terminal de la pila superior esté relacionada con la terminal que apareció más recientemente, de lo contrario, error() fin

Funciones de precedencia

Un analizador de precedencia de operadores normalmente no almacena la tabla de precedencia con las relaciones, que pueden llegar a ser bastante grandes. En su lugar, se definen las funciones de precedencia f y g . [7] Asignan símbolos terminales a números enteros, por lo que las relaciones de precedencia entre los símbolos se implementan mediante comparación numérica: ⁠ ⁠ debe cumplirse si se cumple, etc.

No todas las tablas de relaciones de precedencia tienen funciones de precedencia, pero en la práctica para la mayoría de las gramáticas se pueden diseñar dichas funciones. [8]

Algoritmo para construir funciones de precedencia

El siguiente algoritmo es de Aho et al.: [9]

  1. Cree los símbolos f a y g a para cada terminal gramatical a y para el símbolo de final de cadena;
  2. Particionar los símbolos creados en grupos de modo que f a y g b estén en el mismo grupo si (puede haber símbolos en el mismo grupo incluso si sus terminales no están conectados por esta relación);
  3. Crea un grafo dirigido cuyos nodos sean los grupos. Para cada par de terminales haz lo siguiente: coloca una arista del grupo de g b al grupo de f a si , en caso contrario si coloca una arista del grupo de f a al de g b ;
  4. Si el grafo construido tiene un ciclo entonces no existen funciones de precedencia. Cuando no hay ciclos, sea ⁠ ⁠ la longitud del camino más largo desde el grupo de f a y sea ⁠ ⁠ la longitud del camino más largo desde el grupo de g a .

Ejemplo

Considere la siguiente tabla (repetida de la anterior): [10]

El uso del algoritmo conduce al siguiente gráfico:

 Gíralo \ joder \ / gramo* / F+  | \ | g+ | | $g$f$

de donde extraemos las siguientes funciones de precedencia de las alturas máximas en el grafo acíclico dirigido :

Lenguajes con precedencia de operadores

La clase de lenguajes descritos por gramáticas de precedencia de operadores, es decir, lenguajes de precedencia de operadores, está estrictamente contenida en la clase de lenguajes deterministas libres de contexto , y contiene estrictamente lenguajes visiblemente pushdown . [11]

Los lenguajes de precedencia de operadores disfrutan de muchas propiedades de cierre: unión, intersección, complementación, [12] concatenación, [11] y son la clase más grande conocida cerrada bajo todas estas operaciones y para la cual el problema del vacío es decidible. Otra característica peculiar de los lenguajes de precedencia de operadores es su capacidad de análisis local, [13] que permite un análisis paralelo eficiente.

También existen caracterizaciones basadas en una forma equivalente de autómatas y lógica monádica de segundo orden. [14]

Notas

  1. ^ Aho, Sethi y Ullman 1988, pág. 203
  2. ^ Aho, Sethi y Ullman 1988, págs. 203-204
  3. ^ Aho, Sethi y Ullman 1988, págs. 205-206
  4. ^ abc Aho, Sethi y Ullman 1988, pág. 205
  5. ^ Aho, Sethi y Ullman 1988, pág. 204
  6. ^ Aho, Sethi y Ullman 1988, pág. 206
  7. ^ Aho, Sethi y Ullman 1988, págs. 208-209
  8. ^ Aho, Sethi y Ullman 1988, pág. 209
  9. ^ Aho, Sethi y Ullman 1988, págs. 209-210
  10. ^ Aho, Sethi y Ullman 1988, pág. 210
  11. ^ ab Crespi Reghizzi y Mandrioli 2012
  12. ^ Crespi Reghizzi, Mandrioli y Martín 1978
  13. ^ Barenghi y otros, 2015
  14. ^ Lonati y otros, 2015

Referencias

Lectura adicional

Enlaces externos