Prácticamente, para un lenguaje que eventualmente puede compilarse / transformarse en instrucciones de nivel de sistema, ¿es necesario que sea una gramática libre de contexto?
Ej: ¿Todos los lenguajes de programación / scripting son gramáticas libres de contexto? Java se basa en CFG, pero ¿es realmente el caso de que todos los lenguajes de programación se basen en CFG?
No parece obligatorio, pero hay lagunas en mi entendimiento.
Algún contexto para la pregunta: estaba mirando la especificación del lenguaje Java, que también proporciona las reglas gramaticales . Esto me hizo pensar en esta pregunta.
pl.programming-languages
context-free
sandeepkunkunuru
fuente
fuente
Respuestas:
Dos veces no.
Primero, la mayoría de los HPL no están libres de contexto. Si bien generalmente tienen una sintaxis basada en un CFG, también tienen lo que las personas llaman semántica estática (que a menudo también se incluye en el término sintaxis). Esto puede incluir nombres y tipos que deben verificar para obtener un programa correcto. Por ejemplo,
es un programa Java sintácticamente correcto pero no se compilará porque
d
no está definido ya
no tiene un tipo de ajuste.En segundo lugar, puede analizar lenguajes que no están libres de contexto (como es evidente por la existencia de compiladores). Es solo que los CFG pueden analizarse de manera eficiente, mientras que los CSG no pueden, en general. Sin embargo, puede agregar ciertas características que no están libres de contexto sin dejar de ser eficientes.
Los compiladores a menudo se ejecutan en fases: primero la tokenización (regular), luego el análisis sin contexto, luego el análisis de nombres y tipos (sensible al contexto, a veces incluso más difícil). Puede observar ese comportamiento por el tipo de mensajes de error que recibe.
fuente
public class Program { public static void main(String[] args) { ... } }
... Java no te permitirá salir así de fácil. :-)class A { ... }
es completamente suficiente ya quejavac
compila cosas que realmente no puede ejecutar (por falta de un punto de entrada), también. Pero si.Analizar perl no se puede decidir.
http://www.jeffreykegler.com/Home/perl-and-undecidability/perl-and-undecidability-files/TPR3.pdf?attredirects=0
http://www.perlmonks.org/?node_id=663393
fuente
No creo que la gramática de Python esté libre de contexto. El requisito de que las líneas en el mismo bloque de código tengan la misma cantidad de sangría no es el tipo de cosa que las gramáticas libres de contexto manejan bien.
Más precisamente, parece haber un homomorfismo del lenguaje de los bloques de Python de la forma
fuente
foo * bar;
una declaraciónfoo
como un punterobar
o una multiplicación defoo
tiemposbar
?Bodo Manthey y Martin Böhme muestran que cada compilador de C ++ está necesariamente completo, es decir, puede calcular cualquier función recursiva parcial en tiempo de compilación . Por lo tanto, es mucho peor que solo sensible al contexto.
http://wwwhome.math.utwente.nl/~mantheyb/journals/BotEATCS_BoehmeManthey_CompilingCPP.pdf
fuente
Creo que la declaración antes del uso de variables y la función polimorfismo de los lenguajes OOP son otros ejemplos de especificaciones de lenguajes de programación que no pueden ser manejadas por gramáticas libres de contexto:
Hice una pequeña búsqueda en Google y encontré este artículo: " Una gramática booleana para un lenguaje booleano simple " por A.Okhotin (2004); Según él, el verdadero problema es encontrar un lenguaje de programación que esté completamente descrito por una gramática formal:
Se define un lenguaje de programación procesal de juguete y se construye una gramática booleana para el conjunto de programas bien formados en este lenguaje. Aparentemente, esta es la primera especificación de un lenguaje de programación enteramente por una gramática formal.
La sección de Introducción del artículo es breve pero muy clarificadora.
fuente
Creo que la gramática de C solo es técnicamente libre de contexto, ya que los analizadores siempre usan técnicas no libres de contexto para admitir el dispositivo de Duff .
Los lenguajes basados en sangría no están naturalmente libres de contexto, como dijo David, pero se vuelven libres de contexto en relación con un token de sangría parametrizado.
Haskell le permite cambiar la precedencia del operador con infix e infixl. El estricto módulo pragma de Perl se implementa utilizando las configuraciones léxicas $ ^ H y% ^ H, que lo hacen no contextual, probablemente también otras configuraciones.
Hay lenguajes de expansión de macros como TeX en los que el análisis afaik no tiene sentido sin ejecutarse.
Probablemente haya incluso dos gramáticas libres de contexto cuya intersección no esté libre de contexto, pero aún así describe una máquina de Turing.
Java y el ensamblador probablemente estén naturalmente libres de contexto.
fuente
(a)-b
hacer C sensible al contexto? (a
podría ser una variable o un typedef; algunos otros idiomas no permiten emitir expresiones menos unarias por este motivo)No, y muchos lenguajes prácticos no están libres de contexto. Por ejemplo, la gramática de C ++ no lo es, porque en algunos contextos la resolución de la gramática depende de escribir información que no esté libre de contexto.
fuente
Primero permítanme hacer una distinción entre la sintaxis de un lenguaje de programación y el lenguaje en sí.
La sintaxis de muchos idiomas es (al menos basada en) una Gramática libre de contexto (CFG) porque están bien estudiados y existen algoritmos que pueden analizar eficientemente un CFG y el caso límite que no puede ser resuelto por el CFG puede manejarse especialmente
Sin embargo, de hecho, muchos lenguajes no están libres de contexto (cuando se usan símbolos de declarar antes de usar, por ejemplo, en java, C (++), D).
Dato curioso: D tiene una evaluación de función de tiempo de compilación completa de Turing y una expansión de plantilla que hace que el lenguaje en sí no sea decidible para Turing. Sin embargo, el creador del lenguaje hizo todo lo posible para convertir la sintaxis en un CFG.
fuente
En cuanto a "¿Todos los lenguajes de programación / scripting son gramáticas libres de contexto?" parte se refiere, la respuesta es un No. definitivo
Re: la pregunta principal de "para un lenguaje que eventualmente puede compilarse / transformarse en instrucciones de nivel de sistema", no sé por qué necesariamente tiene que ser un CFG. Sin embargo, podrían surgir mejores explicaciones.
fuente
Un lenguaje de programación debe basarse en algún tipo de formalismo gramatical, de los cuales los CFG son un ejemplo. Si bien los CFG son los más comunes (y son lo habitual que se enseña en los cursos de compilación en las universidades), hay otros formalismos como Parsing Expression Grammars, que puede leer más aquí (pdf) o en Wikipedia para una lectura más pequeña.
fuente