stringtranslate.com

Predicado sintáctico

Un predicado sintáctico especifica la validez sintáctica de la aplicación de una producción en una gramática formal y es análogo a un predicado semántico que especifica la validez semántica de la aplicación de una producción. Es un medio simple y eficaz de mejorar drásticamente la fuerza de reconocimiento de un analizador LL al proporcionar una búsqueda anticipada arbitraria. En su implementación original, los predicados sintácticos tenían la forma “(α)?” y solo podían aparecer en el borde izquierdo de una producción. La condición sintáctica requerida α podría ser cualquier fragmento gramatical válido libre de contexto.

De manera más formal, un predicado sintáctico es una forma de intersección de producción , utilizada en especificaciones de analizadores sintácticos o en gramáticas formales . En este sentido, el término predicado tiene el significado de una función indicadora matemática . Si p 1 y p 2 son reglas de producción, el lenguaje generado tanto por p 1 como por p 2 es su intersección de conjuntos.

Tal como se definen o implementan normalmente, los predicados sintácticos ordenan implícitamente las producciones de modo que las producciones predicadas especificadas antes tengan mayor precedencia que las producciones predicadas especificadas después dentro de la misma decisión. Esto transmite una capacidad para desambiguar producciones ambiguas porque el programador puede especificar simplemente qué producción debe coincidir.

Las gramáticas de expresión de análisis sintáctico (PEG), inventadas por Bryan Ford, extienden estos predicados simples al permitir "predicados no" y permitir que un predicado aparezca en cualquier lugar dentro de una producción. Además, Ford inventó el análisis sintáctico de Packrat para manejar estas gramáticas en tiempo lineal mediante el empleo de la memorización , a costa del espacio de almacenamiento dinámico.

Es posible admitir el análisis sintáctico en tiempo lineal de predicados tan generales como los permitidos por los PEG, pero reducir el costo de memoria asociado con la memorización al evitar el retroceso cuando basta con una implementación más eficiente de la búsqueda anticipada. Este enfoque se implementa en la versión 3 de ANTLR , que utiliza autómatas finitos deterministas para la búsqueda anticipada; esto puede requerir probar un predicado para elegir entre transiciones del DFA (denominado análisis sintáctico "pred-LL (*)"). [1]

Descripción general

Terminología

El término predicado sintáctico fue acuñado por Parr y Quong y diferencia esta forma de predicado de los predicados semánticos (también analizados). [2]

En diversas publicaciones, los predicados sintácticos se denominan coincidencia de múltiples pasos , restricciones de análisis y simplemente predicados (consulte la sección Referencias a continuación). En este artículo se utiliza el término predicado sintáctico a lo largo del texto para mantener la coherencia y distinguirlos de los predicados semánticos.

Propiedades de cierre formal

Bar-Hillel et al. [3] muestran que la intersección de dos lenguajes regulares también es un lenguaje regular, lo que quiere decir que los lenguajes regulares están cerrados bajo la intersección .

La intersección de un lenguaje regular y un lenguaje libre de contexto también es cerrada, y se sabe al menos desde Hartmanis [4] que la intersección de dos lenguajes libres de contexto no es necesariamente un lenguaje libre de contexto (y por lo tanto no es cerrado). Esto se puede demostrar fácilmente utilizando el lenguaje canónico de tipo 1 :

Dejar (Tipo 2)Dejar (Tipo 2)Dejar

Dadas las cadenas abcc , aabbc y aaabbccc , está claro que la única cadena que pertenece tanto a L 1 como a L 2 (es decir, la única que produce una intersección no vacía ) es aaabbccc .

Otras consideraciones

En la mayoría de los formalismos que utilizan predicados sintácticos, la sintaxis del predicado es no conmutativa , es decir, la operación de predicación es ordenada. Por ejemplo, utilizando el ejemplo anterior, considere la siguiente pseudogramática, donde X ::= Y PRED Z se entiende que significa: " Y produce X si y solo si Y también satisface el predicado Z ":

S::= a XX::= Y PREDZY ::= a+ BNCNZ::= ANBN c+BNCN ::= b [BNCN] cANBN ::= a [ANBN] b

Dada la cadena aaaabbbccc , en el caso en que Y debe satisfacerse primero (y asumiendo una implementación voraz), S generará aX y X a su vez generará aaabbbccc , generando así aaaabbbccc . En el caso en que Z debe satisfacerse primero, ANBN no generará aaaabbb , y por lo tanto aaaabbbccc no es generado por la gramática. Además, si Y o Z (o ambos) especifican alguna acción a tomar tras la reducción (como sería el caso en muchos analizadores sintácticos), el orden en que coinciden estas producciones determina el orden en que ocurren esos efectos secundarios. Los formalismos que varían con el tiempo (como las gramáticas adaptativas ) pueden depender de estos efectos secundarios .

Ejemplos de uso

ANTR

Parr y Quong [5] dan este ejemplo de un predicado sintáctico:

 stat :  ( declaración ) ?  declaración  |  expresión  ;

que tiene como objetivo satisfacer las siguientes restricciones de C++ establecidas informalmente [6] :

  1. Si parece una declaración, lo es; de lo contrario
  2. Si parece una expresión, lo es; de lo contrario
  3. Es un error de sintaxis.

En la primera producción de la regla stat, el predicado sintáctico (declaración)? indica que la declaración es el contexto sintáctico que debe estar presente para que el resto de la producción tenga éxito. Podemos interpretar el uso de (declaración)? como "No estoy seguro de si la declaración coincidirá; déjame probarla y, si no coincide, probaré la siguiente alternativa". Por lo tanto, cuando se encuentre una declaración válida, la declaración de la regla se reconocerá dos veces: una como predicado sintáctico y otra durante el análisis real para ejecutar acciones semánticas.

Lo que cabe destacar en el ejemplo anterior es el hecho de que cualquier código activado por la aceptación de la producción de declaración solo ocurrirá si se cumple el predicado.

Ejemplos canónicos

El lenguaje se puede representar en varias gramáticas y formalismos de la siguiente manera:

Análisis de gramáticas de expresiones
 S   & ( A  ! b )  a +  B  ! c  A   a  A ?  b  B   b  B ?  c
§-Cálculo

Usando un predicado enlazado :

S → {A} B
A → X 'c+'X → 'a' [X] 'b'B → 'a+' YY → 'b' [Y] 'c'

Usando dos predicados libres :

A → <'a+'> a <'b+'> b Ψ( a  b ) X <'c+'> c Ψ( b  c ) Y
X → 'a' [X] 'b'Y → 'b' [Y] 'c'
Gramáticas conjuntivas

(Nota: el siguiente ejemplo en realidad genera , pero se incluye aquí porque es el ejemplo dado por el inventor de las gramáticas conjuntivas. [7] ):

S → AB y DCA → aA | εB → bBc | εC → cC | εD → aDb | ε
Reglas de Perl 6
 regla S { <antes de <A> <!antes de b>> a+ <B> <!antes de c> } regla A { a <A>? b } regla B { b <B>? c }

Analizadores sintácticos/formalismos que utilizan alguna forma de predicado sintáctico

Aunque no es de ninguna manera una lista exhaustiva, los siguientes analizadores sintácticos y formalismos gramaticales emplean predicados sintácticos:

ANTLR (Parr y Quong)
Tal como se implementó originalmente, [2] los predicados sintácticos se ubican en el borde más a la izquierda de una producción, de modo que la producción a la derecha del predicado se intenta si y solo si el predicado sintáctico acepta primero la siguiente porción del flujo de entrada. Aunque están ordenados, los predicados se verifican primero, y el análisis de una cláusula continúa si y solo si se satisface el predicado, y las acciones semánticas solo ocurren en los no predicados. [5]
Buscador de patrones ampliado (Balmas)
Balmas se refiere a los predicados sintácticos como "coincidencia de múltiples pasos" en su artículo sobre APM. [8] A medida que un analizador APM analiza, puede vincular subcadenas a una variable y luego verificar esta variable con otras reglas, y continuar analizando si y solo si esa subcadena es aceptable para otras reglas.
Análisis de gramáticas de expresiones (Ford)
Los PEG de Ford tienen predicados sintácticos expresados ​​como el predicado-y y el predicado-no . [9]
§-Cálculo (Jackson)
En el §-Cálculo, los predicados sintácticos se denominaban originalmente simplemente predicados , pero luego se dividen en formas ligadas y libres , cada una con diferentes propiedades de entrada. [10]
Reglas del raku
Raku introduce una herramienta generalizada para describir una gramática llamada rules (reglas) , que son una extensión de la sintaxis de expresiones regulares de Perl 5. [11] Los predicados se introducen a través de un mecanismo de búsqueda anticipada llamado before (antes ), ya sea con " <before ...>" o " <!before ...>" (es decir: " no antes"). Perl 5 también tiene este tipo de búsqueda anticipada, pero sólo puede encapsular las características de expresiones regulares más limitadas de Perl 5.
ProGrammar (Tecnologías NorKen)
El GDL (lenguaje de definición de gramática) de ProGrammar utiliza predicados sintácticos en una forma llamada restricciones de análisis . [12] ATENCIÓN: ¡Este enlace ya no es válido!
Gramáticas conjuntiva y booleana (Okhotin)
Las gramáticas conjuntivas, introducidas por primera vez por Okhotin [13], introducen la noción explícita de conjunción como predicación. El tratamiento posterior de las gramáticas conjuntivas y booleanas [14] es el tratamiento más completo de este formalismo hasta la fecha.

Referencias

  1. ^ Parr, Terence (2007). La referencia definitiva de ANTLR: creación de lenguajes específicos de dominio . The Pragmatic Programmers . pág. 328. ISBN 978-3-540-63293-1.
  2. ^ ab Parr, Terence J. ; Quong, Russell (octubre de 1993). "Adición de predicados semánticos y sintácticos a LL(k): Pred-LL(k)". Adición de predicados semánticos y sintácticos al análisis sintáctico de LL(k): pred-LL(k) . Army High Performance Computing Research Center Preprint No. 93-096. págs. 263–277. CiteSeerX 10.1.1.26.427 . doi :10.1007/3-540-57877-3_18 . Consultado el 26 de agosto de 2023 . 
  3. ^ Bar-Hillel, Y .; Perles, M.; Shamir, E. (1961). "Sobre las propiedades formales de las gramáticas de estructura de frases simples". Zeitschrift für Phonetik, Sprachwissenschaft und Kommunikationsforschung . 14 (2): 143-172..
  4. ^ Hartmanis, Juris (1967). "Lenguajes libres de contexto y cálculos con máquina de Turing". Actas de simposios sobre matemáticas aplicadas . Aspectos matemáticos de la informática. 19. AMS: 42–51. doi : 10.1090/psapm/019/0235938 . ISBN . 9780821867280.
  5. ^ ab Parr, Terence; Quong, Russell (julio de 1995). "ANTLR: un generador de analizador sintáctico predicado-LL(k)" (PDF) . Software: práctica y experiencia . 25 (7): 789–810. doi :10.1002/spe.4380250705. S2CID  13453016.
  6. ^ Stroustrup, Bjarne; Ellis, Margaret A. (1990). Manual de referencia de C++ anotado . Addison-Wesley. ISBN 9780201514599.
  7. ^ Okhotin, Alexander (2001). «Gramáticas conjuntivas» (PDF) . Journal of Automata, Languages ​​and Combinatorics . 6 (4): 519–535. doi :10.25596/jalc-2001-519. S2CID  18009960. Archivado desde el original (PDF) el 26 de junio de 2019.
  8. ^ Balmas, Françoise (20-23 de septiembre de 1994). "Un comparador de patrones aumentado como herramienta para sintetizar descripciones conceptuales de programas". Actas de la KBSE '94. Novena Conferencia de Ingeniería de Software Basada en el Conocimiento . Actas de la Novena Conferencia de Ingeniería de Software Basada en el Conocimiento. Monterey, California. págs. 150-157. doi :10.1109/KBSE.1994.342667. ISBN 0-8186-6380-4.
  9. ^ Ford, Bryan (septiembre de 2002). Packrat Parsing: a Practical Linear-Time Algorithm with Backtracking (tesis de maestría). Instituto Tecnológico de Massachusetts.
  10. ^ Jackson, Quinn Tyler (marzo de 2006). Adaptación a Babel: adaptabilidad y sensibilidad al contexto en el análisis sintáctico . Plymouth, Massachusetts: Ibis Publishing. CiteSeerX 10.1.1.403.8977 . 
  11. ^ Wall, Larry (2002–2006). "Sinopsis 5: expresiones regulares y reglas".
  12. ^ "Lenguaje de definición gramatical". NorKen Technologies.
  13. ^ Okhotin, Alexander (2000). "Sobre la ampliación del formalismo de las gramáticas libres de contexto con una operación de intersección". Actas de la Cuarta Conferencia Internacional "Modelos discretos en la teoría de sistemas de control" (en ruso): 106–109.
  14. ^ Okhotin, Alexander (agosto de 2004). Boolean Grammars: Expressive Power and Algorithms (Tesis doctoral). Kingston, Ontario: Facultad de Informática, Queens University.

Enlaces externos