Parcourir la source

SVI Добавление кода, тестов

SVI il y a 2 ans
Parent
commit
192c56a91f

+ 1 - 0
.gitignore

@@ -1,2 +1,3 @@
 bin
 .vscode
+cover.out

+ 2 - 0
internal/module/coord/coord.go

@@ -0,0 +1,2 @@
+// package coord -- координата литеры
+package coord

+ 19 - 0
internal/module/coord/coord_line/coord_line.go

@@ -0,0 +1,19 @@
+// package coord_line -- номер строки исходника
+package coord_line
+
+import (
+	мАлиас "p78git.ddns.net/svi/odeft/pkg/alias"
+)
+
+// КоордСтрока -- номер строки исходника
+type КоордСтрока struct {
+	знач мАлиас.КоордСтрока
+}
+
+// НовКоордСтрока -- возвращает новую координату строки
+func НовКоордСтрока(номер мАлиас.КоордСтрока) *КоордСтрока {
+	сам := &КоордСтрока{
+		знач: номер,
+	}
+	return сам
+}

+ 24 - 0
internal/module/coord/coord_pos/coord_pos.go

@@ -0,0 +1,24 @@
+// package coord_pos -- позиция литеры в строке
+package coord_pos
+
+import (
+	мАлиас "p78git.ddns.net/svi/odeft/pkg/alias"
+)
+
+// КоордПоз -- позиция литеры в строке
+type КоордПоз struct {
+	знач мАлиас.КоордПоз
+}
+
+// НовКоордПоз -- Возвращает новую позицию в строке
+func НовКоордПоз(поз мАлиас.КоордПоз) *КоордПоз {
+	сам := &КоордПоз{
+		знач: поз,
+	}
+	return сам
+}
+
+// Знач -- возвращает хранимое значение литеры
+func (сам *КоордПоз) Знач() мАлиас.КоордПоз {
+	return сам.знач
+}

+ 31 - 0
internal/module/coord/coord_pos/coord_pos_test.go

@@ -0,0 +1,31 @@
+package coord_pos
+
+import "testing"
+
+/*
+	Тест для позиции в строке
+*/
+
+type тестер struct {
+	т *testing.T
+}
+
+func TestКоордПоз(t *testing.T) {
+	сам := &тестер{
+		т: t,
+	}
+	сам.создать()
+}
+
+// Создание позиции в строке
+func (сам *тестер) создать() {
+	сам.т.Log("создать")
+	поз := НовКоордПоз(5)
+	if поз == nil {
+		сам.т.Fatalf("создать(): поз==нил")
+	}
+	знач := поз.Знач()
+	if знач != 5 {
+		сам.т.Fatalf("создать(): знач!=5")
+	}
+}

+ 3 - 3
internal/module/litera/litera.go

@@ -11,8 +11,8 @@ import (
 
 // Литера -- руна исходника
 type Литера struct {
-	знач мАлиас.Литера  // Хранимая руна
-	тип  мАлиас.РунаТип // Тип руны
+	знач мАлиас.Литера    // Хранимая руна
+	тип  мАлиас.ЛитераТип // Тип руны
 }
 
 // НовЛитера -- возвращает новую литеру
@@ -91,6 +91,6 @@ func (сам *Литера) Знач() мАлиас.Литера {
 }
 
 // Тип -- возвращае ттип руны
-func (сам *Литера) Тип() мАлиас.РунаТип {
+func (сам *Литера) Тип() мАлиас.ЛитераТип {
 	return сам.тип
 }

+ 9 - 4
internal/module/module.go

@@ -14,7 +14,7 @@ import (
 
 // Модуль -- тип модуля для компилятора
 type Модуль struct {
-	имя            string
+	имя            мАлиас.Имя
 	имяФайла       string
 	списЛит        []*мЛит.Литера
 	списЛитКоммент []*мЛит.Литера
@@ -36,7 +36,7 @@ func НовМодуль(имяФайла string) (*Модуль, error) {
 	имя = мСтр.TrimSuffix(имя, ".ou")
 	сам := &Модуль{
 		имяФайла:       имяФайла,
-		имя:            имя,
+		имя:            мАлиас.Имя(имя),
 		списЛит:        []*мЛит.Литера{},
 		списЛитКоммент: []*мЛит.Литера{},
 	}
@@ -83,13 +83,18 @@ func (сам *Модуль) найтиНачало() error {
 		}
 	}
 	{ // Теперь определить наличие разделителя
-		имяПоиск := мАлиас.Литера("")
+		имяПоиск := мАлиас.Имя("")
 		for {
 			литера := сам.списЛит[0]
+			if литера.Знач() == ";" { // Возможно имя закончилось
+				if имяПоиск != сам.имя {
+					return мФорм.Errorf("Модуль.найтиНачало(): имя('%v')!=имя_модуля('%v')", имяПоиск, сам.имя)
+				}
+			}
 			if литера.Тип() != мКонст.Буква {
 				return мФорм.Errorf("Модуль.найтиНачало(): за ключевым словом 'модуль' нет имени модуля")
 			}
-			имяПоиск += литера.Знач()
+			имяПоиск += мАлиас.Имя(литера.Знач())
 			сам.списЛит = сам.списЛит[1:]
 		}
 

+ 11 - 2
pkg/alias/alias.go

@@ -1,8 +1,17 @@
 // package alias -- алиасы типов
 package alias
 
+// КоордПоз -- позиция литеры в строке
+type КоордПоз uint64
+
+// КоордСтрока -- номер строки исходника
+type КоордСтрока uint64
+
+// ЛитераТип -- тип литеры
+type ЛитераТип string
+
 // Литера -- специальный тип литеры
 type Литера string
 
-// РунаТип -- тип руны
-type РунаТип string
+// Имя -- специальный тип для символа (должен начинаться с буквы)
+type Имя string

+ 25 - 25
pkg/cons/cons.go

@@ -6,33 +6,33 @@ import (
 )
 
 const ( // Класс литеры
-	Буква           = мАлиас.РунаТип("буква")
-	Цифра           = мАлиас.РунаТип("цифра")
-	Пробел          = мАлиас.РунаТип("пробел")
-	Точка           = мАлиас.РунаТип("точка")
-	Разделитель     = мАлиас.РунаТип("разделитель") // Например, пробел, таблуция
-	ПереводСтроки   = мАлиас.РунаТип("перевод_строки")
-	Дефис           = мАлиас.РунаТип("дефис")
-	Двоеточие       = мАлиас.РунаТип("двоеточие")
-	ТчкЗпт          = мАлиас.РунаТип("точка_с_запятой")
-	КавычОдинар     = мАлиас.РунаТип("кавычка_одиночная")
-	КомментСтроч    = мАлиас.РунаТип("строчный_комментарий")
-	НовСтрока       = мАлиас.РунаТип("новая_строка")
-	Равно           = мАлиас.РунаТип("равно")
-	СлэшАп          = мАлиас.РунаТип("/")
-	СлэшДаун        = мАлиас.РунаТип("\\")
-	Звезда          = мАлиас.РунаТип("*")
-	СкобкаФигурОткр = мАлиас.РунаТип("скобка_фигурная_откр")
-	СкобкаФигурЗакр = мАлиас.РунаТип("скобка_фигурная_закр")
+	Буква           = мАлиас.ЛитераТип("буква")
+	Цифра           = мАлиас.ЛитераТип("цифра")
+	Пробел          = мАлиас.ЛитераТип("пробел")
+	Точка           = мАлиас.ЛитераТип("точка")
+	Разделитель     = мАлиас.ЛитераТип("разделитель") // Например, пробел, таблуция
+	ПереводСтроки   = мАлиас.ЛитераТип("перевод_строки")
+	Дефис           = мАлиас.ЛитераТип("дефис")
+	Двоеточие       = мАлиас.ЛитераТип("двоеточие")
+	ТчкЗпт          = мАлиас.ЛитераТип("точка_с_запятой")
+	КавычОдинар     = мАлиас.ЛитераТип("кавычка_одиночная")
+	КомментСтроч    = мАлиас.ЛитераТип("строчный_комментарий")
+	НовСтрока       = мАлиас.ЛитераТип("новая_строка")
+	Равно           = мАлиас.ЛитераТип("равно")
+	СлэшАп          = мАлиас.ЛитераТип("/")
+	СлэшДаун        = мАлиас.ЛитераТип("\\")
+	Звезда          = мАлиас.ЛитераТип("*")
+	СкобкаФигурОткр = мАлиас.ЛитераТип("скобка_фигурная_откр")
+	СкобкаФигурЗакр = мАлиас.ЛитераТип("скобка_фигурная_закр")
 
-	СкобкаКругОткр = мАлиас.РунаТип("скобка_круглая_откр")
-	СкобкаКругЗакр = мАлиас.РунаТип("скобка_круглая_закр")
+	СкобкаКругОткр = мАлиас.ЛитераТип("скобка_круглая_откр")
+	СкобкаКругЗакр = мАлиас.ЛитераТип("скобка_круглая_закр")
 
-	СкобкаКвадрОткр = мАлиас.РунаТип("скобка_квадратная_откр")
-	СкобкаКвадрЗакр = мАлиас.РунаТип("скобка_квадратная_закр")
+	СкобкаКвадрОткр = мАлиас.ЛитераТип("скобка_квадратная_откр")
+	СкобкаКвадрЗакр = мАлиас.ЛитераТип("скобка_квадратная_закр")
 
-	Запятая = мАлиас.РунаТип("запятая")
+	Запятая = мАлиас.ЛитераТип("запятая")
 
-	ЗнакВоскл = мАлиас.РунаТип("знак_воскл")
-	ЗнакВопр  = мАлиас.РунаТип("знак_вопр")
+	ЗнакВоскл = мАлиас.ЛитераТип("знак_воскл")
+	ЗнакВопр  = мАлиас.ЛитераТип("знак_вопр")
 )