// package litera -- руна исходника package litera import ( мФорм "fmt" мЮникод "unicode" мКоорд "p78git.ddns.net/svi/odeft/internal/module/coord" мАлиас "p78git.ddns.net/svi/odeft/pkg/alias" мКонст "p78git.ddns.net/svi/odeft/pkg/cons" мТип "p78git.ddns.net/svi/odeft/pkg/types" ) // Литера -- руна исходника type Литера struct { знач мАлиас.Литера // Хранимая руна тип мАлиас.ЛитераТип // Тип руны коорд мТип.ИКоорд // Координата литеры } // НовЛитера -- возвращает новую литеру func НовЛитера(литера мАлиас.Литера, поз мАлиас.КоордПоз, стр мАлиас.КоордСтрока) (*Литера, error) { if литера == "" { return nil, мФорм.Errorf("НовЛитера(): литера пустая") } коорд, ош:=мКоорд.НовКоорд(поз, стр) if ош!=nil{ return nil, мФорм.Errorf("НовЛитера(): при создании ИКоорд, ош=\n\t%w", ош) } сам := &Литера{ знач: литера, коорд: коорд, } if ош := сам.типУст(); ош != nil { return nil, мФорм.Errorf("НовЛитера(): при проверке типа, ош=\n\t%w", ош) } return сам, nil } // Устанавливает тип руны func (сам *Литера) типУст() error { руна := []rune(сам.знач)[0] switch { case мЮникод.IsLetter(руна): сам.тип = мКонст.Буква case мЮникод.IsDigit(руна): сам.тип = мКонст.Цифра case сам.знач == " ": сам.тип = мКонст.Разделитель case сам.знач == ".": сам.тип = мКонст.Точка case сам.знач == "\n": сам.тип = мКонст.ПереводСтроки case сам.знач == "-": сам.тип = мКонст.Дефис case сам.знач == ":": сам.тип = мКонст.Двоеточие case сам.знач == "#": сам.тип = мКонст.КомментСтроч case сам.знач == "=": сам.тип = мКонст.Равно case сам.знач == ";": сам.тип = мКонст.ТчкЗпт case сам.знач == "{": сам.тип = мКонст.СкобкаФигурОткр case сам.знач == "}": сам.тип = мКонст.СкобкаФигурЗакр case сам.знач == "'": сам.тип = мКонст.КавычОдинар case сам.знач == "/": сам.тип = мКонст.СлэшАп case сам.знач == "\\": сам.тип = мКонст.СлэшДаун case сам.знач == "*": сам.тип = мКонст.Звезда case сам.знач == "(": сам.тип = мКонст.СкобкаКругОткр case сам.знач == ")": сам.тип = мКонст.СкобкаКругЗакр case сам.знач == "[": сам.тип = мКонст.СкобкаКвадрОткр case сам.знач == "]": сам.тип = мКонст.СкобкаКвадрЗакр case сам.знач == ",": сам.тип = мКонст.Запятая case сам.знач == "!": сам.тип = мКонст.ЗнакВоскл case сам.знач == "?": сам.тип = мКонст.ЗнакВопр default: return мФорм.Errorf("Литера.типУст(): неизвестный тип руны('%v')", string(сам.знач)) } return nil } // Знач -- возвращает хранимое значение руны func (сам *Литера) Знач() мАлиас.Литера { return мАлиас.Литера(сам.знач) } // Тип -- возвращае ттип руны func (сам *Литера) Тип() мАлиас.ЛитераТип { return сам.тип }