2012-03-27 5 views
12

Ich beginne ein Klassenprojekt, das Go einige Funktionen hinzufügt.Go verwendet Go zum Parsen selbst?

Allerdings bin ich gründlich über die Struktur von Go verwirrt. Ich hatte den Eindruck, dass Go Flex und Bison benutzt hat, aber ich kann nichts finden, was mir im Go-Quellcode bekannt ist.

Auf der anderen Seite hat das Verzeichnis go/src/pkg/go Ordner mit bekannten Namen (ast, Token, Parser usw.), aber alles, was sie enthalten, sind .go-Dateien. Ich bin verwirrt!

Meine Anfrage ist, von jedem, der mit Go vertraut ist, können Sie mir einen Überblick geben, wie Go lexed, geparst usw. ist und wo die Dateien zu finden sind, um die Grammatik zu bearbeiten und was nicht?

+2

Ich wäre nicht überrascht, wenn sie den Parser mit der Hand geschrieben haben (und das Hand-Rollen eines Lexers ist auch nicht fürchterlich fremdartig). Es ist eigentlich ziemlich üblich für reife Compiler und hat verschiedene Vorteile. – delnan

Antwort

8

Die Verzeichnisstruktur:

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 in reinem C geschrieben ist (kein flex). Die Grammatik wird in Bison geschrieben:

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

Viele Verzeichnisse unter src/cmd enthalten eine doc.go Datei mit Kurzbeschreibung des Inhalts des Verzeichnisses.

Wenn Sie planen, die Grammatik zu ändern, sollte beachtet werden, dass die Bison-Grammatik manchmal nicht zwischen Ausdrücken und Typen unterscheidet.

3

Die Go-Compiler sind in c geschrieben, weshalb Sie Flex und Bison brauchen. Das Go-Paket zum Parsen wird nicht verwendet. Wenn Sie in Go einen Selbsthost-Compiler schreiben wollten, könnten Sie das Go-Parsing-Paket verwenden.

+0

Es hat sogar eine Tiefe erste AST Walker und eine Visitor-Schnittstelle eingebaut. Ich bin eigentlich in das Schreiben von Codegen für die einfachsten Bits der Sprache (im Grunde, alles, was nicht die komplexeren Teile der Laufzeit benötigt, wie goroutines und garbage collection, so wird es am Ende C mit einer schöneren Syntax). – matthias

4
+0

Danke! Da 8g der Go-Compiler auf meinem Computer ist, dachte ich, dass die Dateien in src/cmd/8g wären. Was machen die Dateien im 8g-Ordner? – calvin

+0

@ user736932: Diese Quellen bieten architekturspezifische Codegenerierung. Der gc ist/sollte der arch-unabhängige Teil des Compilers sein. – zzzz