// package compiler -- главный тип сервиса компилятора package compiler import ( "fmt" "log" "os" "p78git.ddns.net/svi/odeft/internal/syntax" ) // Compiler -- главный тип сервиса компилятора type Compiler struct { syntax *syntax.Syntax } // NewCompiler -- возвращает новый тип компилятора func NewCompiler() (*Compiler, error) { log.Printf("NewCompiler()\n") sf := &Compiler{} srcMain, err := sf.getMainModule() if err != nil { return nil, fmt.Errorf("NewCompiler(): in get main module, err=\n\t%w", err) } textSrc, err := sf.readMainModule(srcMain) if err != nil { return nil, fmt.Errorf("NewCompiler(): in read main module(%v), err=\n\t%w", srcMain, err) } runeSrc := []rune(textSrc) sf.syntax, err = syntax.NewSyntax(runeSrc) if err != nil { return nil, fmt.Errorf("NewCompiler(): in create Syntax, err=\n\t%w", err) } return sf, nil } // Run -- запускает компилятор в работу func (sf *Compiler) Run() error { log.Printf("Compiler.Run()\n") return nil } // Читает содержимое главного модуля func (sf *Compiler) readMainModule(srcName string) (string, error) { binData, err := os.ReadFile(srcName) if err != nil { sf.printHelp() return "", fmt.Errorf("Compiler.readMainModule(): in read srcMain(%v), err=\n\t%w", srcName, err) } return string(binData), nil } // Получает главный модуль программы из окружния для компиляции func (sf *Compiler) getMainModule() (string, error) { log.Printf("Compiler.getMainModule()\n") srcMain := os.Getenv("SRC_MAIN") if srcMain == "" { sf.printHelp() return "", fmt.Errorf("Compiler.getMainModule(): env SRC_MAIN not set") } return srcMain, nil } const ( help = `Оберон-У компилятор. 2023 г. BSD-2 Для запуска компилятора необходимо определить переменную окружения: export SRC_MAIN="./main.obu" Для подробной справки о языке смотрите тут: http://p78git.ddns.net/svi/odeft ` ) // Печатает справку по использованию func (sf *Compiler) printHelp() { log.Print(help) }