|
|
@@ -2,74 +2,79 @@
|
|
|
package compiler
|
|
|
|
|
|
import (
|
|
|
- "fmt"
|
|
|
- "log"
|
|
|
- "os"
|
|
|
+ мФорм "fmt"
|
|
|
+ мЛог "log"
|
|
|
+ мОс "os"
|
|
|
|
|
|
+ "p78git.ddns.net/svi/odeft/internal/src_rune"
|
|
|
"p78git.ddns.net/svi/odeft/internal/syntax"
|
|
|
)
|
|
|
|
|
|
-// Compiler -- главный тип сервиса компилятора
|
|
|
-type Compiler struct {
|
|
|
- syntax *syntax.Syntax
|
|
|
+// Компилятор -- главный тип сервиса компилятора
|
|
|
+type Компилятор struct {
|
|
|
+ syntax *syntax.Синтаксис
|
|
|
}
|
|
|
|
|
|
-// NewCompiler -- возвращает новый тип компилятора
|
|
|
-func NewCompiler() (*Compiler, error) {
|
|
|
- log.Printf("NewCompiler()\n")
|
|
|
- sf := &Compiler{}
|
|
|
+// НовКомпилятор -- возвращает новый тип компилятора
|
|
|
+func НовКомпилятор() (*Компилятор, error) {
|
|
|
+ мЛог.Printf("НовКомпилятор()\n")
|
|
|
+ сам := &Компилятор{}
|
|
|
|
|
|
- srcMain, err := sf.getMainModule()
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("NewCompiler(): in get main module, err=\n\t%w", err)
|
|
|
+ исхГлавИмя, ош := сам.главМодульПолуч()
|
|
|
+ if ош != nil {
|
|
|
+ return nil, мФорм.Errorf("НовКомпилятор(): при получении главного модуля, ош\n\t%w", ош)
|
|
|
}
|
|
|
- textSrc, err := sf.readMainModule(srcMain)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("NewCompiler(): in read main module(%v), err=\n\t%w", srcMain, err)
|
|
|
+ исхГлавТекст, ош := сам.исхГлавЧитать(исхГлавИмя)
|
|
|
+ if ош != nil {
|
|
|
+ return nil, мФорм.Errorf("НовКомпилятор(): in read main module(%v), ош=\n\t%w", исхГлавТекст, ош)
|
|
|
}
|
|
|
- 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)
|
|
|
+ _, ош = сам.руныКлассифицировать(исхГлавТекст)
|
|
|
+ if ош != nil {
|
|
|
+ return nil, мФорм.Errorf("НовКомпилятор(): при классификации рун главного модуля(%v), ош=\n\t%w", исхГлавИмя, ош)
|
|
|
}
|
|
|
- return sf, nil
|
|
|
+ runeSrc := []rune(исхГлавТекст)
|
|
|
+ сам.syntax, ош = syntax.НовСинтаксис(runeSrc)
|
|
|
+ if ош != nil {
|
|
|
+ return nil, мФорм.Errorf("НовКомпилятор(): при создании Синтаксис, ош=\n\t%w", ош)
|
|
|
+ }
|
|
|
+ return сам, nil
|
|
|
}
|
|
|
|
|
|
-// Run -- запускает компилятор в работу
|
|
|
-func (sf *Compiler) Run() error {
|
|
|
- log.Printf("Compiler.Run()\n")
|
|
|
- if err := sf.syntax.Run(); err != nil {
|
|
|
- return fmt.Errorf("Compiler.Run(): in work main syntax, err=\n\t%w", err)
|
|
|
+// Пуск -- запускает компилятор в работу
|
|
|
+func (сам *Компилятор) Пуск() error {
|
|
|
+ мЛог.Printf("Компилятор.Пуск()\n")
|
|
|
+ if ош := сам.syntax.Пуск(); ош != nil {
|
|
|
+ return мФорм.Errorf("Компилятор.Пуск(): при работе Синтаксис в главном модуле, ош=\n\t%w", ош)
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
// Читает содержимое главного модуля
|
|
|
-func (sf *Compiler) readMainModule(srcName string) (string, error) {
|
|
|
- binData, err := os.ReadFile(srcName)
|
|
|
- if err != nil {
|
|
|
+func (sf *Компилятор) исхГлавЧитать(исхГлавИмя string) (string, error) {
|
|
|
+ бинДанные, ош := мОс.ReadFile(исхГлавИмя)
|
|
|
+ if ош != nil {
|
|
|
sf.printHelp()
|
|
|
- return "", fmt.Errorf("Compiler.readMainModule(): in read srcMain(%v), err=\n\t%w", srcName, err)
|
|
|
+ return "", мФорм.Errorf("Компилятор.исхГлавЧитать(): при чтении главного модуля(%v), ош=\n\t%w", исхГлавИмя, ош)
|
|
|
}
|
|
|
- return string(binData), nil
|
|
|
+ return string(бинДанные), nil
|
|
|
}
|
|
|
|
|
|
// Получает главный модуль программы из окружния для компиляции
|
|
|
-func (sf *Compiler) getMainModule() (string, error) {
|
|
|
- log.Printf("Compiler.getMainModule()\n")
|
|
|
- srcMain := os.Getenv("SRC_MAIN")
|
|
|
- if srcMain == "" {
|
|
|
+func (sf *Компилятор) главМодульПолуч() (string, error) {
|
|
|
+ мЛог.Printf("Компилятор.главМодульПолуч()\n")
|
|
|
+ исхГлавИмя := мОс.Getenv("SRC_MAIN")
|
|
|
+ if исхГлавИмя == "" {
|
|
|
sf.printHelp()
|
|
|
- return "", fmt.Errorf("Compiler.getMainModule(): env SRC_MAIN not set")
|
|
|
+ return "", мФорм.Errorf("Компилятор.главМодульПолуч(): env SRC_MAIN not set")
|
|
|
}
|
|
|
- return srcMain, nil
|
|
|
+ return исхГлавИмя, nil
|
|
|
}
|
|
|
|
|
|
const (
|
|
|
- help = `Оберон-У компилятор. 2023 г. BSD-2
|
|
|
+ справкаПоЗапуску = `Оберон-У компилятор. 2023 г. BSD-2
|
|
|
|
|
|
Для запуска компилятора необходимо определить переменную окружения:
|
|
|
- export SRC_MAIN="./main.obu"
|
|
|
+ export SRC_MAIN="./main.ou"
|
|
|
|
|
|
Для подробной справки о языке смотрите тут:
|
|
|
http://p78git.ddns.net/svi/odeft
|
|
|
@@ -78,6 +83,11 @@ const (
|
|
|
)
|
|
|
|
|
|
// Печатает справку по использованию
|
|
|
-func (sf *Compiler) printHelp() {
|
|
|
- log.Print(help)
|
|
|
+func (sf *Компилятор) printHelp() {
|
|
|
+ мЛог.Print(справкаПоЗапуску)
|
|
|
+}
|
|
|
+
|
|
|
+// Классифицирует руны исходника
|
|
|
+func (сам *Компилятор) руныКлассифицировать(текстИсх string) ([]src_rune.ИсхРуна, error) {
|
|
|
+ return nil, мФорм.Errorf("Компилятор.руныКлассифицировать(): доделать")
|
|
|
}
|