2012-05-21 18 views
7

He buscado en Internet en busca de información para novatos sobre el desarrollo de C# Abstract Syntax Trees, pero solo puedo encontrar información para personas que ya están 'al tanto'. Soy un desarrollador de aplicaciones de línea de negocio, por lo que temas como estos son un poco sobre mi cabeza, pero esto es para mi propia educación, así que estoy dispuesto a pasar el tiempo y aprender los conceptos que sean necesarios.Developing Abstract Syntax Tree

En general, me gustaría aprender sobre las técnicas detrás de desarrollar una representación abstracta de código a partir de una cadena de código. Más específicamente, me gustaría poder usar este AST para hacer resaltado de sintaxis C#. (Me doy cuenta de que el resaltado de sintaxis no necesita un AST, pero esta parece ser una buena oportunidad para aprender algunas técnicas de nivel de "compilador")

Me disculpo si esta pregunta es un poco amplia, pero estoy no estoy seguro de qué más preguntar.

Gracias!

+0

FWIW, si quieres un buen lugar para comenzar con los compiladores, el libro del dragón es (en mi humilde opinión) un gran libro. http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools –

+0

@ James Manning: ¡Gracias, lo comprobaré! –

Respuesta

12

Primero necesita comprender qué es el análisis sintáctico y qué son los árboles sintácticos abstractos. Para esto, puede consultar Wikipedia on abstract syntax trees para un primer vistazo.

Realmente necesita pasar algún tiempo con un libro de texto del compilador para comprender cómo se relacionan los sintaxis abstractos con el análisis, y se puede construir durante el análisis; la referencia clásica es el libro "Compiladores" de Aho/Ullman/Sethi (se encuentra fácilmente en la web). Puede encontrar la respuesta SO a Are there any "fun" ways to learn about Languages, Grammars, Parsing and Compilers? instructiva.

Una vez que comprenda cómo crear un AST para una gramática simple, puede centrar su atención en algo así como C#. El problema aquí es la escala pura; una cosa es jugar con un lenguaje de juguete con 20 reglas de gramática. Otra cosa es trabajar con la gramática de varios cientos o mil reglas. La experiencia de los pequeños hará que sea mucho más fácil comprender cómo se juntan los grandes y cómo vivir con ellos.

Probablemente no desee construir su propia gramática de C# (o implementar la del estándar C#); es bastante trabajo Puede obtener herramientas disponibles que le proporcionarán C# AST (ya se mencionó a Roslyn, ANTLR tiene un analizador C#, hay muchas más).

Es cierto que puede usar un AST para resaltar la sintaxis (aunque eso probablemente sea matar a un mosquito con un mazo). Lo que la mayoría de la gente no piensa mucho (pero los libros del compilador enfatizan), es lo que sucede después de que tienes un AST; en general, no son útiles por sí mismos. Realmente necesitas mucha más maquinaria para hacer algo interesante. En lugar de repetir esto una y otra vez (sigo viendo el mismo tipo de preguntas), puede ver mi discusión en Life After Parsing para obtener más detalles.

+0

¡Gracias, el tipo de respuesta que estaba buscando! –

+0

Sé que esto es un poco tarde, pero ¿has mirado [GOLD Parser] (http://goldparser.org/)? Este programa le permite construir una gramática utilizando reglas BNF y generar código de esqueleto en cualquier idioma para procesar el árbol de análisis sintáctico, es decir, interpretar el código mientras camina por el árbol de análisis sintáctico o genera código. – Intrepid

+0

@Mike Clarke: Pensé que GOLD analizó, solo. ¿Realmente construye un árbol de análisis sintáctico? No hay evidencia de esto que pueda ver en las páginas web http://goldparser.org/doc/index.htm –

1

Eche un vistazo a Roslyn. Creo que podría ser lo que estás buscando. ¡Te da acceso a los compiladores AST, entre muchas otras cosas increíbles!

http://blogs.msdn.com/b/visualstudio/archive/2011/10/19/introducing-the-microsoft-roslyn-ctp.aspx

Más allá de eso, sugiero un libro de texto sobre los compiladores.

+0

Creo que Roslyn no es un buen ejemplo de un árbol de sintaxis * abstracto *. Su árbol de sintaxis contiene cada punto y coma, comentario y espacio en blanco, lo que lo convierte en un árbol de sintaxis muy concreto. Pero si el objetivo era resaltar la sintaxis, Roslyn sería una buena opción. – svick

+0

¿Algún libro de texto en particular que puedas recomendar? Realmente no estoy buscando una solución preparada, estoy buscando edificarme desarrollando mi propia solución. –

2

Usted probablemente debería echar un vistazo a esta charla por Phil Trelford:

Write your own compiler in 24 hours

Este hombre es un genio, y dejará encendido para arriba para aprender acerca de los compiladores. Él lo explica literalmente lo suficientemente fácil como para que un niño de cinco años lo entienda. El niño de cinco años en cuestión es su hijo, por lo que probablemente tenga una ventaja injusta, pero cinco es cinco.