Browse Source

SVI Добавление кода, целей сборки, тестовых исходников

SVI 2 years ago
parent
commit
08bebc04dd
7 changed files with 155 additions and 2 deletions
  1. 1 0
      .gitignore
  2. 4 2
      Makefile
  3. 21 0
      cmd/ouc/main.go
  4. 4 0
      dev.sh
  5. 80 0
      internal/compiler/compiler.go
  6. 26 0
      internal/syntax/syntax.go
  7. 19 0
      src/main.obu

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+bin

+ 4 - 2
Makefile

@@ -1,11 +1,12 @@
 SERVICE_URL=gitlab.aescorp.ru/dsp_dev/claim/cryptopro_service
-FILE_MAIN=./cmd/ou/main.go
+FILE_MAIN=./cmd/ouc/main.go
 ADAPT_PATH = ./api
 
 build:
 	clear
 	go fmt ./...
 	go build -o ./bin/ouc $(FILE_MAIN)
+	cp ./src ./bin
 win.build:
 	clear
 	go fmt ./...
@@ -14,7 +15,8 @@ dev.run:
 	clear
 	go fmt ./...
 	go build -race -o ./bin/ouc_dev $(FILE_MAIN)
-	./ouc_dev.sh
+	cp -r ./src ./bin
+	./dev.sh
 mod:
 	clear
 	go get -u ./...

+ 21 - 0
cmd/ouc/main.go

@@ -0,0 +1,21 @@
+// package main -- пускач для компилятора Оберона-У
+package main
+
+import (
+	"log"
+
+	"p78git.ddns.net/svi/odeft/internal/compiler"
+)
+
+func main() {
+	log.Printf("main(): Оберон-У компилятор\n")
+	app, err := compiler.NewCompiler()
+	if err != nil {
+		log.Printf("main(): in create Compiler, err=\n\t%v\n", err)
+		panic(1)
+	}
+	if err := app.Run(); err != nil {
+		log.Printf("main(): in run Compiler, err=\n\t%v\n", err)
+		panic(2)
+	}
+}

+ 4 - 0
dev.sh

@@ -0,0 +1,4 @@
+export SRC_MAIN="./src/main.obu"
+
+cd ./bin && \
+./ouc_dev

+ 80 - 0
internal/compiler/compiler.go

@@ -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)
+}

+ 26 - 0
internal/syntax/syntax.go

@@ -0,0 +1,26 @@
+// package syntax -- синтаксический потоковый анализатор
+//
+//	Читает по одно литере и пытается определеить символ
+package syntax
+
+import (
+	"fmt"
+	"log"
+)
+
+// Syntax -- синтаксический потоковый анализатор
+type Syntax struct {
+	textSrc []rune // Исходный набо рун для анализа
+}
+
+// NewSyntax -- возвращает новый потоовый синтаксический анализатор
+func NewSyntax(textSrc []rune) (*Syntax, error) {
+	log.Printf("NewSyntax()\n")
+	if textSrc == nil {
+		return nil, fmt.Errorf("NewSyntax(): text==nil")
+	}
+	sf := &Syntax{
+		textSrc: textSrc,
+	}
+	return sf, nil
+}

+ 19 - 0
src/main.obu

@@ -0,0 +1,19 @@
+До объявления модуля можно писать что угодно. И за это
+никому ничего не будет. Здесь же можно втыкать опции компилятора.
+Что-то вроде такого:
+
+#ouc: org=100h
+#ouc: cpu=oberon-risc
+
+модуль Главный;
+
+импорт {
+
+}
+
+{
+
+}.
+
+Здесь, после окончаня модуля тоже можно писать что угодно.
+Хоть картинки с котиками вставлять. В ASCII, разумеется.