Pregunta

fondo: - existen lenguajes formales para expresar lenguaje de programación léxico y sintaxis válidos - tales representaciones (por ejemplo, expresiones regulares y gramáticas libres de contexto) pueden compilarse automáticamente en analizadores de léxico / sintaxis para algún lenguaje de programación utilizando algunas herramientas (por ejemplo, LEX y YACC)

preguntas: ¿Existen lenguajes formales para definir la semántica del lenguaje de programación? - ¿existen compiladores para automatizar la generación del código del analizador semántico basado en estos lenguajes formales? - ¿Hay recursos para leer sobre el análisis semántico del código fuente?

notas: - puede que mi pregunta no sea realista, está bien & # 8217; está bien & # 8230; ¿Soy un novato en compiladores? - por análisis semántico realmente me refiero a recopilar la información necesaria del código fuente para los próximos pasos de optimización y generación de código & # 8230; esto debe incluir la verificación de tipo / límite & # 8230; etc.

espero haberme aclarado muchas gracias de antemano

¿Fue útil?

Solución

Existen muchos esquemas para definir la semántica de los lenguajes de programación: semántica denotacional (que mapea la sintaxis en funciones que calculan el estado del programa); semántica operativa (que equivale a construir intérpretes para su idioma), semántica transformacional (que equivale a traducir su lenguaje a otro lenguaje para el cual ya existe alguna otra semántica), etc.

Muy pocos de ellos actualmente conducen a sistemas utilizables para lenguajes de programación reales. Una de las otras respuestas aquí sugiere que Centaur es un sistema que intenta hacer esto. ... = onepage & q = & f = false "rel =" nofollow noreferrer "> La semántica de acción de Peter Mosses es uno de los intentos recientes más serios.

Para sistemas reales, los métodos más ad hoc son actualmente los más efectivos. Estos incluyen sistemas en los que la sintaxis léxica y gramatical puede ser efectiva definido (como variantes de LEX y YACC), y automáticamente construir árboles. Las gramáticas de atributos permiten la especificación de cálculos sobre árboles, que permiten definir algunos tipos de análisis, como la tabla de símbolos construcción o métrica (técnicamente podría hacer semántica denotacional de esta manera). Lenguajes más convencionales (C, Java, C #, COBOL, ...) todos tienen estructuras relativamente similares con respecto al flujo de control y flujo de datos, y como consecuencia uno puede construir rutinas genéricas de análisis de flujo para permitir que uno razone sobre dichos lenguajes estándar.

Finalmente, necesita un propósito para su análisis semántico: qué hechos exactamente quieres extraer? El análisis estático disponible. los sistemas tienen métodos de código de procedimiento / patrón híbrido para Recolectar la sintaxis, la tabla de símbolos y los datos de flujo de interés para calcular respuestas específicas a preguntas específicas.

Algunos sistemas permiten utilizar esta información semántica para transportar modificación del código fuente.

Un sistema que sigue el enfoque más ad hoc anterior es nuestro DMS Software Reengineering Toolkit , que también tiene las definiciones semánticas genéricas (sintaxis, tablas de símbolos, análisis de flujo de datos) completado de verdad lenguajes como Java, C, C ++ y COBOL. DMS puede aplicar transformaciones de fuente a fuente a los AST condicionados mediante diversos procedimientos de recopilación de datos, y esto permite la masa transformación de código de manera confiable.

Otros consejos

Existen muchos lenguajes formales para programar la semántica de los lenguajes: consulte la entrada de wikipedia para algunos Más términos para google. Hice una pequeña cantidad de Z en mi carrera inicial (ese enlace al wiki de métodos formales es otro posible lugar para comenzar a explorar). Sugeriría preguntar en el lambda the ultimate como la gente de allí usa algunos de ellos, y puede sugerir qué usar para cualquier caso de uso que tenga en mente; este documento parece algo relacionado con lo que solicitó en términos de generación de compiladores: necesita tanto la semántica del lenguaje como una descripción de la máquina de destino para crear un compilador.

Específicamente para el análisis estático, mire http: //rw4.cs. uni-sb.de/~martin/pag/

Lo que usted describe es exactamente de qué se trataba el proyecto Centaur:

http://www-sop.inria.fr/croap/centaur /centaur.html

De hecho, podría describir la semántica de su idioma, hasta el punto en que el sistema pudo darle un intérprete para ese idioma (fue entonces cuando describió la semántica por completo). Pero no tenías que ir hasta el final. Podría hacer menos trabajo de descripción y aún así obtener un editor estructurado y un comprobador de tipos para sus esfuerzos.

Aunque el trabajo ha cesado en el proyecto (por lo que puedo decir), Puede encontrar artículos interesantes y descargarlos en los enlaces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top