2012-03-27 3 views
12

私はいくつかの機能をGoに追加することについてのクラスプロジェクトを開始しています。Goは自分自身を解析するためにGoを使用しますか?

しかし、Goの構造については完全に混乱しています。私はGoがflexとbisonを使用したが、Goのソースコードにはなじみのないものは見つけられないという印象を受けました。

一方、go/src/pkg/goディレクトリにはよく知られている名前(ast、token、parserなど)のフォルダがありますが、それらにはすべて.goファイルが含まれています。よくわかりません!

私の要求は、Goに精通している人のうち、Goがどのようにレキシングされ、解析されているか、そして文法やその他のものを編集するためのファイルをどこで見つけるかを概観できますか?

+2

パーザを手で書いても(そしてレクサーの手書きはあまりにも異国的ではない)、私は驚くことはありません。実際には成熟したコンパイラではよくあり、さまざまな利点があります。 – delnan

答えて

8

ディレクトリ構造:

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) 

レクサーは、純粋なC(NO flex)に書き込まれます。文法はバイソンで書かれている:src/cmd

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

多くのディレクトリは、ディレクトリの内容の短い説明とdoc.goファイルが含まれています。

文法を変更する予定の場合は、Bison文法が式と型を区別しないことがあります。

3

Goコンパイラはcで書かれているので、flexとbisonが必要です。解析用のGoパッケージは使用されません。 Goで自己ホスティングコンパイラを作成する場合は、Go解析パッケージを使用できます。

+0

深度優先のASTウォーカーとVisitorインターフェイスが組み込まれています。私は実際には、言語の最も単純な部分についてcodegenを書いています(基本的に、ランタイムのより複雑な部分は必要ありません。 goroutinesとガーベッジコレクション、それはより良い構文でCになるだろう)。 – matthias

4
+0

ありがとう! 8gはコンピュータ上のGoコンパイラなので、ファイルはsrc/cmd/8gにあると思っていました。 8gフォルダのファイルは何をしますか? – calvin

+0

@ user736932:これらのソースはアーキテクチャ固有のコード生成を提供します。 gcはコンパイラのアーチに依存しない部分です。 – zzzz

関連する問題