// package compiler -- главный тип сервиса компилятора package compiler import ( мФорм "fmt" мЛог "log" мОс "os" "p78git.ddns.net/svi/odeft/internal/module/src_rune" "p78git.ddns.net/svi/odeft/internal/syntax" ) // Компилятор -- главный тип сервиса компилятора type Компилятор struct { syntax *syntax.Синтаксис } // НовКомпилятор -- возвращает новый тип компилятора func НовКомпилятор() (*Компилятор, error) { мЛог.Printf("НовКомпилятор()\n") сам := &Компилятор{} исхГлавИмя, ош := сам.главМодульПолуч() if ош != nil { return nil, мФорм.Errorf("НовКомпилятор(): при получении главного модуля, ош\n\t%w", ош) } исхГлавТекст, ош := сам.исхГлавЧитать(исхГлавИмя) if ош != nil { return nil, мФорм.Errorf("НовКомпилятор(): in read main module(%v), ош=\n\t%w", исхГлавТекст, ош) } _, ош = сам.руныКлассифицировать(исхГлавТекст) if ош != nil { return nil, мФорм.Errorf("НовКомпилятор(): при классификации рун главного модуля(%v), ош=\n\t%w", исхГлавИмя, ош) } runeSrc := []rune(исхГлавТекст) сам.syntax, ош = syntax.НовСинтаксис(runeSrc) if ош != nil { return nil, мФорм.Errorf("НовКомпилятор(): при создании Синтаксис, ош=\n\t%w", ош) } return сам, nil } // Пуск -- запускает компилятор в работу func (сам *Компилятор) Пуск() error { мЛог.Printf("Компилятор.Пуск()\n") if ош := сам.syntax.Пуск(); ош != nil { return мФорм.Errorf("Компилятор.Пуск(): при работе Синтаксис в главном модуле, ош=\n\t%w", ош) } return nil } // Читает содержимое главного модуля func (sf *Компилятор) исхГлавЧитать(исхГлавИмя string) (string, error) { бинДанные, ош := мОс.ReadFile(исхГлавИмя) if ош != nil { sf.printHelp() return "", мФорм.Errorf("Компилятор.исхГлавЧитать(): при чтении главного модуля(%v), ош=\n\t%w", исхГлавИмя, ош) } return string(бинДанные), nil } // Получает главный модуль программы из окружния для компиляции func (sf *Компилятор) главМодульПолуч() (string, error) { мЛог.Printf("Компилятор.главМодульПолуч()\n") исхГлавИмя := мОс.Getenv("SRC_MAIN") if исхГлавИмя == "" { sf.printHelp() return "", мФорм.Errorf("Компилятор.главМодульПолуч(): env SRC_MAIN not set") } return исхГлавИмя, nil } const ( справкаПоЗапуску = `Оберон-У компилятор. 2023 г. BSD-2 Для запуска компилятора необходимо определить переменную окружения: export SRC_MAIN="./main.ou" Для подробной справки о языке смотрите тут: http://p78git.ddns.net/svi/odeft ` ) // Печатает справку по использованию func (sf *Компилятор) printHelp() { мЛог.Print(справкаПоЗапуску) } // Классифицирует руны исходника func (сам *Компилятор) руныКлассифицировать(текстИсх string) ([]src_rune.ИсхРуна, error) { return nil, мФорм.Errorf("Компилятор.руныКлассифицировать(): доделать") }