2011-10-19 22 views

Respuesta

14

Permítanme hacerlo simple: no hay forma de generar un AST del programa Scala con el analizador solo. Es absolutamente necesario ejecutar typer, y eso significa tipo de inferencia e implícita.

Después de eso, puede hacer lo que quiera. Pero estas primeras pocas fases del compilador (cuatro en las versiones más recientes, contando el typer) son necesarias.

Coincidentemente, esas son las fases ejecutadas por el presentation compiler, que es utilizado por el Scala IDE for Eclipse. Me parece que esta podría ser la interfaz perfecta para ti.

ENSIME también uses it, que parece ser la mejor fuente de información al respecto, y también puede que desee echar un vistazo a la herramienta Scala Refactoring, ya que utiliza el compilador de AST también.

Finalmente, puedes intentar compilar el código con -Ybrowse:typer para ver el árbol después de typer. Use -Xshow-phases para visualizar las fases existentes, o -Xprint:typer para imprimir la "fuente" después de typer (o cualquier otra fase).

+1

Creo que su respuesta básica es engañosa. Si tienes una gramática, puedes generar un AST; después de todo, las gramáticas y los árboles (sintaxis) tienen una sintaxis pura. Estoy de acuerdo, a menudo necesitas información de tipo para interpretar el AST de manera útil. (No me opongo a tus consejos sobre maquinaria útil). –

+1

@Ira. Supone que el lenguaje puede _parsed_ con una gramática. Perl, por ejemplo, [no puede] (http://www.perlmonks.org/?node_id=663393). En Scala, el jurado todavía está fuera: algunas personas han intentado construir un analizador basado en las especificaciones EBNF, pero descubrieron que no funciona del todo. Tal vez Scala se pueda analizar a partir de una gramática, pero, en la práctica, cualquier tipo de análisis sería _inútil_ sin tipeo, ya que parte de ese código se proporciona implícitamente en esa fase. –

+0

Esta misma historia se ha contado sobre C++, también. Está mal. Lo que es cierto es que algunos de los análisis pueden ser ambiguos localmente. Incluso pueden ser muy ambiguos, localmente. Sobre todo lo que esto significa es la tecnología de análisis que la gente usa (LL (k) y LALR (1)) es bastante mala en esto. Eso no significa que la tecnología de análisis correcta sea pésima. Consulte el análisis de GLR, que maneja dichas ambigüedades con aplomo. Analizamos C++ de esta manera a pesar de los teoremas populares sobre que es "difícil". Estamos trabajando en un analizador Perl, pero está en segundo plano. Tengo problemas para creer que Scala es tan desagradable como Perl. –

Cuestiones relacionadas