/ / Las relaciones entre lenguaje, compilador, expresión regular, análisis léxico y análisis [cerrado] - expresiones regulares, construcción del compilador, compilación, análisis léxico

Las relaciones entre lenguaje, compilador, expresión regular, análisis léxico y análisis [cerrado] - expresiones regulares, compilación de compilación, compilación, análisis léxico

Estoy aprendiendo compilador y me confundí un poco acerca de todos esos términos / áreas sobre lenguaje / compilador.

Así que aquí comparto mi comprensión de las relaciones entre ellos y espero que alguien pueda aprobar o corregir mi pensamiento.


Es bastante difícil para el desarrollador crear aplicaciones escribiendo directamente el código de la máquina, por lo que necesitamos un alto nivel language. Y el programa que normalmente escribimos se convierte así en un conjunto de texts.

Un lenguaje usa regular expressions para definir la sintaxis, es decir, si todos los textos en el programa de texto son buenos o no.

La tarea de la compiler es traducir esos texts al código de máquina siguiendo la regla de la definición del lenguaje.

Los dos primeros pasos de un compiler son análisis léxico y analizar gramaticalmente.

los lexical análisis convertir las expresiones regulares a una NFA / DFA, y trabajar a través de los textos del programa, y ​​validarlos y convertirlos en tokens.

los parsing lidiar con esas fichas y comprobar su semántica.


¿Tengo razón sobre todo lo anterior?

Otra pregunta es que una definición de lenguaje es una expresión regular y usamos parsing ¿Parte para validar la gramática del programa?

Respuestas

3 para la respuesta № 1

Y el programa que normalmente escribimos se convierte así en un conjunto de textos.

La palabra "texto" no es realmente un término común en la construcción del compilador (o al menos no uno que haya escuchado antes). A menudo, un programa se traduce primero en una secuencia de tokens (que son básicamente las "palabras" ¹ de laidioma) y luego esa secuencia se traduce en un árbol de sintaxis. Ese árbol puede luego transformarse aún más y finalmente se convertirá en una secuencia de instrucciones de máquina, que conforman el programa compilado.

Un lenguaje usa expresiones regulares para definir la sintaxis, es decir, si todos los textos en el programa de texto son buenos o no.

La sintaxis de un lenguaje describe que programas Son estructuralmente válidas o no (sin tener en cuentaerrores de tipo de cuenta y errores de tiempo de ejecución, que se manejan por separado). No puede hacer eso usando expresiones regulares, ya que la gran mayoría de los idiomas no son regulares, es decir, son más complicados de lo que puede describir una expresión regular. Por ejemplo, no puede decir "t" para cada paréntesis de apertura, debe haber un cierre. paréntesis "utilizando una expresión regular.

Las expresiones regulares se usan a menudo para describir los tokens de un idioma. Es decir, los identificadores en el idioma coinciden con la expresión regular. [a-zA-Z_][a-zA-Z0-9_]* y los números coinciden con la expresión regular [0-9]+".

La forma en que esas fichas encajan para formar un programa completo se describe en una gramática.

Los dos primeros pasos de un compilador son el análisis léxico y el análisis.

Por lo general, sí.

El análisis léxico convierte las expresiones regulares a NFA / DFA, y trabaja a través de los textos del programa, los valida y los convierte en tokens.

Si usa un generador lexer, entonces el generadortomará un montón de expresiones regulares que le dio y las convertirá en autómatas y luego producirá un código basado en ellas. Ese código generado es el lexer, que tomará la fuente del programa y producirá una secuencia de tokens.

Tenga en cuenta que las conversiones entre regulareslas expresiones y los autómatas ocurren cuando se ejecuta el generador, no como parte de su compilador. Y si escribe el lexer a mano, no se realizará ninguna conversión entre expresiones regulares y autómatas (excepto posiblemente en su cabeza).

El análisis trata con esas fichas y comprueba su semántica.

No. La fase de análisis toma las fichas y se asegura de que se ajusten a la sintaxis de la lengua. Si lo hacen, realizará acciones basadas en la estructura sintáctica del lenguaje. A menudo eso significa construir un árbol de sintaxis. Para lenguajes simples también es posible hacer análisis semánticos (como la verificación de tipos) y generar código directamente en el analizador.

Si construyes un árbol de sintaxis, las fases consecuentes luego irán sobre ese árbol y ahí es donde entra en juego la semántica del lenguaje.

¿Otra pregunta es que una definición de lenguaje es una expresión regular y usamos la parte de análisis para validar la gramática del programa?

La definicion de una lengua sintaxis Generalmente se da como una gramática, no una regularexpresión. Como dije, las expresiones regulares no son lo suficientemente expresivas para eso. Usamos el análisis para validar que un programa dado se ajusta a la gramática del lenguaje (así como para determinar la estructura sintáctica del programa).

La definición de un lenguaje consiste en la definición de la sintaxis del lenguaje y la definición de su semántica. Esta última a menudo se da en forma de texto.

¹ Aquí estoy usando el significado coloquial de la palabra "palabra", no su significado teórico-lenguaje.


2 para la respuesta № 2

Es bastante difícil para el desarrollador crear aplicaciones escribiendo directamente el código de la máquina, por lo que necesitamos un lenguaje de alto nivel. Y el programa que normalmente escribimos se convierte así en un conjunto de textos.

DE ACUERDO.

Un lenguaje usa expresiones regulares para definir la sintaxis, es decir, si todos los textos en el programa de texto son buenos o no.

No. Un lenguaje utiliza una gramática libre de contexto para definir la sintaxis, y posiblemente expresiones regulares para definir el léxico. Las expresiones regulares no pueden representar recursividad, por lo que no se pueden usar para definir lenguajes de programación que tienen sintaxis recursiva, que es prácticamente todos ellos.

La tarea del compilador es traducir esos textos a código de máquina siguiendo la regla de la definición de idioma.

DE ACUERDO.

Los dos primeros pasos de un compilador son el análisis léxico y el análisis.

DE ACUERDO.

El análisis léxico convierte las expresiones regulares a NFA / DFA.

No. El programa que genera El analizador léxico hace eso, si hay uno. El analizador generado solo usa NFA o DFA directamente.

y trabajar a través de los textos del programa, y ​​validarlos y convertirlos en fichas.

No. Solo hace lo segundo. El analizador realiza la mayor parte de la validación, junto con una fase que se ha denominado la fase de "semántica estática".

El trato de análisis con esas fichas.

Sí.

y comprobar su semántica.

No. El análisis no tiene nada que ver con la semántica. Esa es la provincia del resto del compilador.

Otra pregunta es que entonces una definición de un lenguaje es expresión regular.

No, ver más arriba.

y usamos la parte de análisis para validar la gramática del programa?

No, para validar el programa. en contra la gramática.