我開始了一個關於爲Go添加一些功能的類項目。Go使用Go來解析它自己?
但是,我對Go的結構感到十分困惑。我的印象是Go使用了flex和bison,但在Go源代碼中找不到任何熟悉的東西。
另一方面,目錄go/src/pkg/go具有熟悉的名稱(ast,token,parser等)的文件夾,但它們包含的都是.go文件。我很困惑!
我的請求是,任何熟悉Go的人都可以給我一個關於Go是如何lexed,parsed等的概述,以及在哪裏可以找到編輯文法和文件的文件?
我開始了一個關於爲Go添加一些功能的類項目。Go使用Go來解析它自己?
但是,我對Go的結構感到十分困惑。我的印象是Go使用了flex和bison,但在Go源代碼中找不到任何熟悉的東西。
另一方面,目錄go/src/pkg/go具有熟悉的名稱(ast,token,parser等)的文件夾,但它們包含的都是.go文件。我很困惑!
我的請求是,任何熟悉Go的人都可以給我一個關於Go是如何lexed,parsed等的概述,以及在哪裏可以找到編輯文法和文件的文件?
目錄結構:
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(無flex
)。語法是寫在野牛:
src/cmd/gc/lex.c
src/cmd/gc/go.y
src/cmd
下,許多目錄包含doc.go
文件與目錄的內容簡短描述。
如果您打算修改語法,應該注意的是,Bison語法有時不區分表達式和類型。
Go編譯器是用c編寫的,這就是爲什麼你需要flex和野牛。不使用Go包解析。如果您想在Go中編寫自主託管編譯器,則可以使用Go解析包。
它甚至有一個深度優先的AST walker和一個內置的Visitor接口。我實際上正在研究爲該語言的最簡單部分編寫codegen(基本上,任何不需要更復雜的運行時部分,比如goroutines和垃圾收集,所以它最終會成爲一個更好的語法C)。 – matthias 2012-04-07 08:00:23
如果他們手工編寫解析器(並且手動翻譯詞法分析器也不是非常怪異),我不會感到驚訝。這對於成熟的編譯器來說確實很常見,並且具有各種優點。 – delnan 2012-03-27 16:56:56