2012-03-27 7 views
12

Sto avviando un progetto di classe che riguarda l'aggiunta di alcune funzionalità a Go.Vai utilizza Vai a analizzare se stesso?

Tuttavia, sono completamente confuso sulla struttura di Go. Avevo l'impressione che Go usasse flex e bison ma non trovo nulla di familiare nel codice sorgente Go.

D'altra parte, la directory go/src/pkg/go ha cartelle con nomi familiari (ast, token, parser, ecc.) Ma tutti contengono file .go. Non ho capito bene!

La mia richiesta è, di chiunque abbia familiarità con Go, puoi darmi una panoramica di come Go è lexed, parsed, ecc. E dove trovare i file per modificare la grammatica e cosa no?

+2

Non sarei sorpreso se avessero scritto il parser a mano (e anche il rollare a mano un lexer non è terribilmente stravagante). In realtà è abbastanza comune per i compilatori maturi e ha vari vantaggi. – delnan

risposta

8

La struttura di directory:

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 è scritto in puro C (senza flex). La grammatica è scritto in Bison:

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

Molte le directory sotto src/cmd contengono un file doc.go con una breve descrizione del contenuto della directory.

Se si intende modificare la grammatica, è opportuno notare che la grammatica Bison a volte non distingue tra espressioni e tipi.

3

I compilatori Go sono scritti in c, ecco perché è necessario il flex e il bisonte. Il pacchetto Go per l'analisi non viene utilizzato. Se si desidera scrivere un compilatore self-hosting in Go, è possibile utilizzare il pacchetto di analisi di Go.

+0

Ha anche un walker AST di profondità e un'interfaccia Visitor incorporata. In realtà sto studiando la scrittura di codegen per i bit più semplici del linguaggio (in pratica, tutto ciò che non richiede le parti più complesse del runtime, come goroutines e garbage collection, quindi finirà per essere C con una sintassi migliore). – matthias

4
+0

Grazie! Poiché 8g è il compilatore Go sul mio computer, avevo pensato che i file fossero in src/cmd/8g. Cosa fanno i file nella cartella 8g? – calvin

+0

@ user736932: queste origini forniscono una generazione di codice specifica per l'architettura. Il gc è/dovrebbe essere la parte indipendente dal compilatore. – zzzz