2012-03-27 10 views
12

Estoy comenzando un proyecto de clase que se refiere a agregar alguna funcionalidad a Go.Go usa Ir a analizarse?

Sin embargo, estoy completamente confundido sobre la estructura de Go. Tenía la impresión de que Go usaba flex y bison pero no encuentro nada familiar en el código fuente de Go.

Por otro lado, el directorio go/src/pkg/go tiene carpetas con nombres conocidos (ast, token, analizador, etc.) pero todo lo que contienen son archivos .go. ¡Estoy confundido!

Mi solicitud es que, de cualquiera que esté familiarizado con Go, ¿me puede dar una descripción general de cómo Go está lexed, analizado, etc. y dónde encontrar los archivos para editar la gramática y otras cosas?

+2

No me sorprendería si escribieran el analizador sintáctico a mano (y el rodar manualmente un lexer tampoco es terriblemente extraño). En realidad, es bastante común para compiladores maduros, y tiene varias ventajas. – delnan

Respuesta

8

La estructura de directorios:

src/cmd/5* ARM 
src/cmd/6* amd64 (x86-64) 
src/cmd/8* i386 (x86-32) 

src/cmd/cc C compiler (common part) 
src/cmd/gc Go compiler (common part) 
src/cmd/ld Linker  (common part) 
src/cmd/6c C compiler (amd64-specific part) 
src/cmd/6g Go compiler (amd64-specific part) 
src/cmd/6l Linker  (amd64-specific part) 

lexer está escrito en C puro (sin flex). Gramática está escrito en bisonte:

src/cmd/gc/lex.c 
src/cmd/gc/go.y 

Muchos directorios bajo src/cmd contienen un archivo doc.go con una breve descripción del contenido del directorio.

Si planea modificar la gramática, debe tenerse en cuenta que la gramática de Bison a veces no distingue entre expresiones y tipos.

3

Los compiladores Go están escritos en c, razón por la cual necesita flexión y bisonte. El paquete Go para analizar no se usa. Si quería escribir un compilador autohospedado en Go, podría usar el paquete de análisis Go.

+0

Incluso tiene un andador AST en profundidad y una interfaz de visitante integrada. De hecho, estoy buscando escribir codegen para los bits más simples del lenguaje (básicamente, cualquier cosa que no necesite las partes más complejas del tiempo de ejecución, como los goroutines y la recolección de basura, por lo que terminará siendo C con una sintaxis más agradable). – matthias

4
+0

¡Gracias! Como 8g es el compilador Go de mi computadora, pensé que los archivos estarían en src/cmd/8g. ¿Qué hacen los archivos en la carpeta 8g? – calvin

+0

@ user736932: Esas fuentes proporcionan generación de código específico de arquitectura. El gc es/debería ser la parte independiente del arco del compilador. – zzzz