| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // 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("Компилятор.руныКлассифицировать(): доделать")
- }
|