¿Qué obtendría si agregara parámetros a las gramáticas libres de contexto?


13

Estaba pensando en gramáticas para lenguajes sensibles a la indendación y parece que las gramáticas CF funcionarían si se combinaran con parámetros. Como ejemplo, considere este fragmento para la gramática simplificada de Python en formato ANTLR:

// on top-level the statements have empty indent
program  
    : statement('')+
    ;

// let's consider only one compound statement and one simple statement for now
statement(indent) 
    : ifStatement(indent)
    | passStatement(indent)
    ;

passStatement(indent)
    : indent 'pass' NEWLINE
    ;

// statements under if must have current indent plus 4 spaces
ifStatement(indent)
    : indent 'if' expression ':' NEWLINE (statement(indent '    ')+)
    ;

Mi pregunta: ¿Este tipo de gramáticas (CFG con parámetros) tiene un nombre?

Parece que no sería difícil escribir un analizador de descenso recursivo para esta gramática (los parámetros deberían ser básicamente analizadores sintácticos). ¿Cuáles podrían ser las dificultades con este enfoque?

¿La adición de parámetros eleva la clase de idioma compatible por encima de libre de contexto?


1
Si el conjunto de valores que pueden tomar los parámetros es finito, entonces todavía es trivialmente libre de contexto (puede iterar sobre todos los valores y escribirlo todo).
Ratchet Freak

1
Vale la pena señalar que su propuesta es para lenguajes sensibles a la sangría con sangría fija. Python (y otros lenguajes similares) no están restringidos de esta manera; aceptan cualquier sangría que el usuario quiera. Eso no afecta la capacidad de análisis (excepto para el manejo de los caracteres de tabulación), pero sería difícil expresarlo con su propuesta, al menos según tengo entendido.
rici 01 de


@HendrikJan, las gramáticas de atributos son una forma de anotar la gramática con acción semántica, no controlan el análisis.
Programador

1
Si el objetivo es manejar la sangría, eso es más adecuado para el tokenizador que para el analizador. Haga que el tokenizador emita tokens virtuales INDENT y UNINDENT cuando cambie el nivel de sangría. Entonces no hay necesidad de aumentar la gramática del lenguaje con información sobre sangría.
John Kugelman

Respuestas:


14

Las gramáticas afijadas ( gramáticas parametrizadas libres de contexto) fueron estudiadas ampliamente por el eminente científico holandés en informática Cornelis HA Koster , comenzando con su artículo de 1962 "Basic English, una gramática generativa para una parte del inglés", coescrito con LGLT Meertens. En 1970, produjo un formalismo del concepto; Un resumen útil está disponible en su artículo de 1971 "Affix Grammars for Programming Language", una versión de la cual encontré en Citeseer .

En ese artículo, Koster compara su formalismo (y otro similar) con las gramáticas de dos niveles de Van Wijngaarden , y encuentra que son muy similares.

La invaluable bibliografía anotada de Dick Grune de técnicas de análisis incluye una gran cantidad de otras referencias útiles para gramáticas de afijo y otros formalismos no Chomskyianos. (Consulte la sección 18.2.6 de la bibliografía, aunque hay documentos útiles en otras secciones.) Grune cubre brevemente las gramáticas de los afijos en §15.3.2 de la segunda edición de Parsing Techniques: A Practical Guide (y aún más brevemente en la primera edición) , disponible en línea) mencionando el hecho de que es fácil adaptar las técnicas de análisis de arriba hacia abajo (y otras).

unnortesinorteCnorte

Koster, quien también fue editor del informe Algol 68, fue el desarrollador original del lenguaje de descripción del compilador (CDL) , basado en sus ideas sobre las gramáticas de afijo. Este juego de herramientas y sus derivados posteriores se utilizaron en la producción durante muchos años. Esta página , que encontré con una búsqueda en Google y cuya permanencia no puedo garantizar, tiene enlaces al manual y al sitio de descarga para CDL3.


Siento que los lenguajes CDL se parecen más a las gramáticas de atributos : los valores de los atributos se pueden calcular mediante funciones definidas externamente. Me gustaría reservar la gramática de afijo de nombre para los casos en que las relaciones entre los valores de los afijos (atributos) se definen dentro del formalismo, como en las Gramática de afijos extendidos .
reinierpost

@reinierpost: Usted tiene, por supuesto, derecho a su propia terminología; El privilegio no se limita a los huevos antropomórficos. Sin embargo, el propio manual de CDL afirma que "CDL3 es un lenguaje de implementación basado en gramáticas de afijo", que creo que debería tenerse en cuenta. (Manual disponible en ftp.cs.kun.nl/pub/cdl3/cdl3-manual-1.2.7.pdf ). Eso es lo que reclamé en mi respuesta: que CDL se basó en el trabajo de Koster en gramáticas de afijo. Como señala Grune, la diferencia entre las gramáticas de afijo y atributo es leve; Su distinción es si los afijos se utilizan para decidir la validez sintáctica.
rici

(La cita es de la primera página del manual.)
rici

Lo sé ... y tienes razón. Mi comentario no estaba destinado a contradecirlo.
reinierpost

6

Tome el lema de bombeo para CFG :

Toma la gramática

S -> A("")
A(p) -> p 
      | p '\n' A(p"*") '\n' p 

Esto describe un triángulo estelar:

*
**
***
**
*

tuvwXy{tuvnortewXnorteyEl |norte>0 0}vX

Esto significa que el triángulo estelar no es un lenguaje libre de contexto.

O un ejemplo más simple:

S-> B("")
B(p)-> p 'a' p 'a' p
     | B(p 'b')

{sinorteunsinorteunsinorteEl |norte0 0}


3

Nunca he visto este formalismo presentado (incluso en algo como las Técnicas de análisis de Grune ), dependiendo de los detalles sobre cómo se define exactamente "los parámetros deberían ser básicamente analizadores sintéticos" parece mapeable para las gramáticas de dos niveles de Van Wijngaarden, que tienen el mismo poder que gramática de estructura de fase sin restricciones (es decir, más potente que sensible al contexto, podría escribir una gramática VW que ofrezca todos los programas de detención).



Koster y su grupo estudiaron dos tipos de gramáticas de afijo, que yo sepa: 1) formas restringidas de gramáticas de Van Wijngaarden, destinadas a permitir un reconocimiento más fácil; 2) los lenguajes CDL, lenguajes prácticos de descripción de compiladores sin ninguna manipulación explícita de valores de afijo, pero con la opción de definir reglas en el idioma de destino (por ejemplo, ensamblador), haciéndolos completos de Turing.
reinierpost
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.