Con el desarrollo de un lenguaje de programación en lenguaje C - analizador gramática

directorio

La lista precedente

" Desarrollar un lenguaje lenguaje de programación C. - Interactivo Shell "
, " el desarrollo de un lenguaje de programación en lenguaje C - una multiplataforma "

La naturaleza del lenguaje de programación

En la década de 1850, el lingüista Noam Chomsky define una serie de importantes teorías del lenguaje. Estas teorías apoya nuestra comprensión básica de la estructura del lenguaje de hoy. Una conclusión importante es: el lenguaje natural se basa en subestructuras recursivas y repetitivas . La teoría de Chomsky presentado es muy importante. Esto significa que mientras que una lengua puede expresar el contenido infinita, todavía podemos utilizar las reglas limitadas para resolver todo con el lenguaje escrito de. Estas reglas limitadas se llama sintaxis (gramática).

Cuando aprendemos un lenguaje natural, que tienden a comenzar con la gramática. Cuando aprendemos un lenguaje de programación, también, cuando tratamos de desarrollar un lenguaje de programación es también el caso, la primera cosa a considerar es la sintaxis del lenguaje y la semántica.

realización analizador

Con el fin de definir la sintaxis de un lenguaje de programación, primero tiene que ser capaz de resolver los programas de usuario escritos de acuerdo con las reglas de la gramática correcta. Con este fin, el programa tendrá un analizador de lenguaje de programación, que se utiliza para determinar la legalidad de la entrada del usuario, y generar una representación analizada interna. representación interna es una representación de un ordenador más fácil de entender, con ello, estamos detrás de la resolución, el trabajo de evaluación será más simple y factible.

Use una combinación de librería de resolución MPC

MPC (Micro analizador combinadores) es de unos bibliotecas ligero y robusto analizador C combinatorias. Puede utilizar esta biblioteca analizador escrito en cualquier lenguaje. Hay muchas formas de escribir un programa de análisis, los beneficios de utilizar una combinación de biblioteca analizador es que simplifica en gran medida el trabajo aburrido de otra manera embotado, sólo tiene que centrarse en las reglas de sintaxis abstracta de alto nivel escritos en ella.

Nota: Los desarrolladores de MPC es el "construir su propio Lisp" autor original.

MPC se puede utilizar:

  • Resolver los existentes, o desarrollar nuevo lenguaje de programación
  • Resolver existentes o desarrollar nuevo formato de datos

MPC características:

  • generador de análisis de expresiones regulares
  • generador de análisis
  • Fácil integración en programas de lenguaje C (en forma de un archivo de origen)
  • generar automáticamente un mensaje de error
  • Tipo genérico (Pan mecanografiado)
  • Predictivo, recursiva Descenso

instalar

Antes de escribir este analizador, primero tiene que instalar la biblioteca MPC. biblioteca de MPC es muy sencillo de instalar, sólo tiene que descargar el código fuente, los archivos de origen de la copia a nuestro proyecto en lenguaje C, y luego mpc contiene los archivos de cabecera en el proyecto y vincular la biblioteca de MPC.

Descargar :

$ git clone https://github.com/orangeduck/mpc.git

copiar :

$  ll
总用量 140
-rw-r--r-- 1 root root 111731 4月   7 18:12 mpc.c
-rw-r--r-- 1 root root  11194 4月   7 18:12 mpc.h
-rwxr-xr-x 1 root root   8632 4月   7 18:08 parsing
-rw-r--r-- 1 root root   1203 4月   7 18:11 parsing.c

Introducido en parsing.c :

#include "mpc.h"

recopilar :

gcc -std=c99 -Wall parsing.c mpc.c -lreadline -lm -o parsing
  • -lm: enlace de la biblioteca matemática.

Primeros pasos

Vamos a escribir un Dux (el lenguaje de Shiba Inu, Shiba Inu idioma) se familiaricen con el uso MPC lenguaje analizador.
Aquí Insertar imagen Descripción

Primer vistazo a la sintaxis del lenguaje Doge Descripción:

  • Adjetivo (adjetivo): wow, muchos, así, por ejemplo.
  • Sustantivo (名词): Lisp, el lenguaje, c, libro, construir.
  • Frase (frase): los componentes adjetivo + sustantivo.
  • Dux (lenguaje de Shiba): Frase consta de varios componentes.

Aquí tratamos de usar el MPC para definir el lenguaje Dux.

  • 1 STEP uso MPC definición de adjetivo y nombre, para lo cual creamos dos analizadores.:
/* Build a parser 'Adjective' to recognize descriptions */
mpc_parser_t *Adjective = mpc_or(4, 
  mpc_sym("wow"), mpc_sym("many"),
  mpc_sym("so"),  mpc_sym("such")
);

/* Build a parser 'Noun' to recognize things */
mpc_parser_t *Noun = mpc_or(5,
  mpc_sym("lisp"), mpc_sym("language"),
  mpc_sym("book"),mpc_sym("build"), 
  mpc_sym("c")
);

Lo cual, devuelve la función mpc_or un analizador que significa "elegir uno", ya que necesitamos del nombre y adjetivo "de cada uno" para componer frases, por lo definen dos analizador.

  • 2 el PASO . Usando el adjetivo ya definido, NOMBRE Frase analizador analizador para definir:
mpc_parser_t *Phrase = mpc_and(2, mpcf_strfold, Adjective, Noun, free);

mpc_and función devuelve un analizador que sólo acepta cada uno de los estados "cláusula de" aparecen en el orden. Gentilicio Así que definimos anteriormente se le ha pasado, dijimos: adjetivo posterior seguida de una composición sintagma nominal . mpcf_strfold y los estados individuales gratuitas organización designada (Fold) y el modo de borrado (gratuito).

  • . 3 PASO . Frase utilizada para definir analizador idioma Doge, se compone de varios composición Frase Doge, es esta función lógica mpc_many expresión:
mpc_parser_t *Doge = mpc_many(mpcf_strfold, Phrase);

Los espectáculos declaración anterior que Dux pueden tomar cualquier número de declaraciones. Esto también significa que el lenguaje Doge es infinita. Estos son algunos ejemplos de Dux en línea con la sintaxis:

/* 一条 Doge 语句由若干个 Phrase 组成,一个 Phrase 由一个 Adjective + 一个 Noun 构成。 */
"wow book such language many lisp"  
"so c such build such language"
"many build wow c"
""
"wow lisp wow c many language"
"so c"

Como el anterior, simplemente definir un lenguaje Dux. Puede seguir utilizando otras funciones proporcionadas por mpc, paso a paso, para escribir un analizador puede analizar la sintaxis más compleja. Pero está claro que la aplicación del código no es amigable, con el aumento de la complejidad de la gramática, la legibilidad del código será cada vez peor.

Así MPC también ofrece una serie de funciones para ayudar a los usuarios con mayor facilidad realizan tareas comunes, utilizar estas funciones para una mejor acumulación más rápida analizadores idiomas complejos y pueden proporcionar un mayor control de grano fino. Documentación específica se puede encontrar en la página web del proyecto (https://github.com/orangeduck/mpc).

Aquí, utilizamos otro más cerca de la MPC para proporcionar una forma natural para escribir código para implementar las reglas de la gramática: la totalidad de las reglas gramaticales lenguaje escrito en una larga cadena, en lugar de utilizar el lenguaje C difíciles de entender el largo aliento. Ya no tiene que preocuparse acerca de cómo usar los parámetros libres mpcf_strfold u organización o declaraciones individuales de borrado. Todo este trabajo se realiza de forma automática.

mpc_parser_t* Adjective = mpc_new("adjective");
mpc_parser_t* Noun      = mpc_new("noun");
mpc_parser_t* Phrase    = mpc_new("phrase");
mpc_parser_t* Doge      = mpc_new("doge");

mpca_lang(MPCA_LANG_DEFAULT,
  "                                           \
    adjective : \"wow\" | \"many\"            \
              |  \"so\" | \"such\";           \
    noun      : \"lisp\" | \"language\"       \
              | \"book\" | \"build\" | \"c\"; \
    phrase    : <adjective> <noun>;           \
    doge      : <phrase>*;                    \
  ",
  Adjective, Noun, Phrase, Doge);

/* Do some parsing here... */

mpc_cleanup(4, Adjective, Noun, Phrase, Doge);
  1. Utilice reglas de sintaxis nombre de función mpc_new definidos.
  2. Utilice definición de la función específica mpca_lang de estas reglas gramaticales.

El primer parámetro es la marca mpca_lang función operativa, en la que usamos la MPCA_LANG_DEFAULT opciones por defecto. El segundo parámetro es una cadena larga de lenguaje C. Esta cadena se definen las reglas de sintaxis específicas. Cada regla está dividido en dos partes por dos puntos :separado con una ;extremos regla de representación:

  • Izquierdo del colon es el nombre de las reglas de la gramática, por ejemplo, adjetivo, sustantivo, frase, doge.
  • El derecho se define reglas gramaticales, por ejemplo adjetivo: wow, muchos, así, por ejemplo.

mpca_lang función es empaquetar mpc_many, mpc_and, mpc_or estas funciones, la realización de estas funciones automáticamente, por lo que la definición del código del analizador se convierte en limpio, no desordenado.

Algunos símbolos especiales definen el papel de las reglas gramaticales son los siguientes:
Aquí Insertar imagen Descripción

Publicados 508 artículos originales · ganado elogios 1358 · Vistas 1,88 millones +

Supongo que te gusta

Origin blog.csdn.net/Jmilk/article/details/105353385
Recomendado
Clasificación