una terminales simbolos resueltos programar programacion notacion lenguaje gramatica ejercicios derivacion compiladores como compiler-construction programming-languages grammar context-free-grammar

compiler-construction - terminales - gramatica de un lenguaje de programacion



Cómo definir una gramática para un lenguaje de programación. (6)

Echa un vistazo a Bison , tal vez eso es lo que estás buscando?

Cómo definir una gramática (sin contexto) para un nuevo lenguaje de programación (lenguaje de programación obligatorio) que desea diseñar desde cero.

En otras palabras: cómo proceder cuando desea crear un nuevo lenguaje de programación desde cero.




Si te refieres a definir una gramática, lo mejor sería comenzar comenzando con un idioma existente y modificando su gramática para que coincida con lo que buscas. Crear una especificación gramatical es un ejercicio bastante mecánico, usando un conjunto de patrones en tu propia cabeza. Por ejemplo, ¿cómo se ve una instrucción if? Se parece a c

if <- if(exp) block

if <- if(exp) block else block2

o como ML?

if <- if exp then block else block end

O tal vez quieras usar elseifs como Lua:

if <- if exp then exp end

if <- if exp then exp (elseif exp)* else exp end

La gramática y la semántica codifican estas decisiones. Tenga en cuenta que ninguno de estos es todavía adecuado para la implementación en un generador de compiladores LALR o LL (*) todavía, y debería ser masajeado para la implementación porque son ambiguos.

Programming Language Pragmatics de Michael Scott es una buena introducción al diseño de lenguajes de programación. Está disponible en Amazon here


Un paso a la vez.

No en serio, comience con expresiones y operadores, trabaje hacia arriba para hacer declaraciones, luego a funciones / clases, etc. Mantenga una lista de qué puntuación se usa para qué.

En paralelo, defina la sintaxis para referirse a variables, matrices, hashes, números literales, cadenas de caracteres, otros literales incorporados. También en paralelo, defina su modelo de nomenclatura de datos y reglas de alcance.

Para verificar si su gramática tiene sentido, enfóquese en un nivel (literal / variable, operador, expresión, declaración, función, etc.) y asegúrese de que la puntuación y los tokens de otros niveles intercalados o anexados / añadidos no causen una ambigüedad.

Finalmente, escríbalo todo en EBNF y ejecútelo a través de ANTLR o similar.

También es mejor no reinventar la rueda. Normalmente comienzo seleccionando secuencias para iniciar y finalizar bloques y funciones de instrucciones, y operadores matemáticos, que suelen ser fundamentalmente de tipo C, ECMAScript, Basic, basados ​​en listas de comandos o basados ​​en XML. Esto ayuda mucho porque esto es con lo que la gente está acostumbrada a trabajar.

Por supuesto, tiene que encontrar una razón bastante convincente para no abandonar la escritura de un nuevo idioma y simplemente quedarse con C, ECMAScript o Basic, que están bien probados y son muy utilizados.

A menudo, comencé a definir un nuevo idioma solo para encontrar a alguien que ya ha implementado una función en algún idioma existente.

Si su objetivo es la velocidad de desarrollo para algún proyecto específico, es mejor que esté haciendo prototipos en algo como Python, Lua o SpiderMonkey si desea comenzar a trabajar rápidamente y desea reducir la cantidad de escritura necesaria en la mayoría de los idiomas compilados. .