|
|
@@ -0,0 +1,80 @@
|
|
|
+// 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)
|
|
|
+}
|