2012-03-27 4 views
12

Я начинаю проект класса, который касается добавления некоторых функций в Go.Go использует Go, чтобы разобрать себя?

Однако я полностью смущен структурой Go. У меня создалось впечатление, что Go used flex и bison, но я не могу найти ничего знакомого в исходном коде Go.

С другой стороны, каталог go/src/pkg/go имеет папки со знакомыми именами (ast, токен, парсер и т. Д.), Но все, что они содержат, являются .go-файлами. Я смущен!

Моя просьба о том, кто знаком с Go, можете ли вы дать мне обзор того, как Go lexed, разбирался и т. Д., И где искать файлы для редактирования грамматики и еще чего?

+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 (без flex). Грамматика написана в Bison:

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

Многие каталоги под src/cmd содержат doc.go файл с кратким описанием содержимого каталога.

Если вы планируете модифицировать грамматику, следует отметить, что грамматика Bison иногда не различает выражения и типы.

3

Компиляторы Go написаны на c, поэтому вам нужны гибкие и бизоны. Пакет Go для разбора не используется. Если вы хотите написать собственный хостинг-компилятор в Go, вы можете использовать пакет парсера Go.

+0

У него даже есть основанный на глубине АСТ ходок и встроенный интерфейс Visitor. Я на самом деле занимаюсь написанием codegen для самых простых бит языка (в основном, для чего-то, что не требует более сложных частей среды выполнения, например goroutines и сбор мусора, поэтому в итоге это будет C с более сильным синтаксисом). – matthias

4
+0

Спасибо! Поскольку 8g является компилятором Go на моем компьютере, я думал, что файлы будут в src/cmd/8g. Что делают файлы в папке 8g? – calvin

+0

@ user736932: Эти источники обеспечивают создание кода, основанного на архитектуре. Gc является/должна быть независимой от дуги частью компилятора. – zzzz