litera.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // package litera -- руна исходника
  2. package litera
  3. import (
  4. мФорм "fmt"
  5. мЮникод "unicode"
  6. мКоорд "p78git.ddns.net/svi/odeft/internal/module/coord"
  7. мАлиас "p78git.ddns.net/svi/odeft/pkg/alias"
  8. мКонст "p78git.ddns.net/svi/odeft/pkg/cons"
  9. мТип "p78git.ddns.net/svi/odeft/pkg/types"
  10. )
  11. // Литера -- руна исходника
  12. type Литера struct {
  13. знач мАлиас.Литера // Хранимая руна
  14. тип мАлиас.ЛитераТип // Тип руны
  15. коорд мТип.ИКоорд // Координата литеры
  16. }
  17. // НовЛитера -- возвращает новую литеру
  18. func НовЛитера(литера мАлиас.Литера, поз мАлиас.КоордПоз, стр мАлиас.КоордСтрока) (*Литера, error) {
  19. if литера == "" {
  20. return nil, мФорм.Errorf("НовЛитера(): литера пустая")
  21. }
  22. коорд, ош:=мКоорд.НовКоорд(поз, стр)
  23. if ош!=nil{
  24. return nil, мФорм.Errorf("НовЛитера(): при создании ИКоорд, ош=\n\t%w", ош)
  25. }
  26. сам := &Литера{
  27. знач: литера,
  28. коорд: коорд,
  29. }
  30. if ош := сам.типУст(); ош != nil {
  31. return nil, мФорм.Errorf("НовЛитера(): при проверке типа, ош=\n\t%w", ош)
  32. }
  33. return сам, nil
  34. }
  35. // Устанавливает тип руны
  36. func (сам *Литера) типУст() error {
  37. руна := []rune(сам.знач)[0]
  38. switch {
  39. case мЮникод.IsLetter(руна):
  40. сам.тип = мКонст.Буква
  41. case мЮникод.IsDigit(руна):
  42. сам.тип = мКонст.Цифра
  43. case сам.знач == " ":
  44. сам.тип = мКонст.Разделитель
  45. case сам.знач == ".":
  46. сам.тип = мКонст.Точка
  47. case сам.знач == "\n":
  48. сам.тип = мКонст.ПереводСтроки
  49. case сам.знач == "-":
  50. сам.тип = мКонст.Дефис
  51. case сам.знач == ":":
  52. сам.тип = мКонст.Двоеточие
  53. case сам.знач == "#":
  54. сам.тип = мКонст.КомментСтроч
  55. case сам.знач == "=":
  56. сам.тип = мКонст.Равно
  57. case сам.знач == ";":
  58. сам.тип = мКонст.ТчкЗпт
  59. case сам.знач == "{":
  60. сам.тип = мКонст.СкобкаФигурОткр
  61. case сам.знач == "}":
  62. сам.тип = мКонст.СкобкаФигурЗакр
  63. case сам.знач == "'":
  64. сам.тип = мКонст.КавычОдинар
  65. case сам.знач == "/":
  66. сам.тип = мКонст.СлэшАп
  67. case сам.знач == "\\":
  68. сам.тип = мКонст.СлэшДаун
  69. case сам.знач == "*":
  70. сам.тип = мКонст.Звезда
  71. case сам.знач == "(":
  72. сам.тип = мКонст.СкобкаКругОткр
  73. case сам.знач == ")":
  74. сам.тип = мКонст.СкобкаКругЗакр
  75. case сам.знач == "[":
  76. сам.тип = мКонст.СкобкаКвадрОткр
  77. case сам.знач == "]":
  78. сам.тип = мКонст.СкобкаКвадрЗакр
  79. case сам.знач == ",":
  80. сам.тип = мКонст.Запятая
  81. case сам.знач == "!":
  82. сам.тип = мКонст.ЗнакВоскл
  83. case сам.знач == "?":
  84. сам.тип = мКонст.ЗнакВопр
  85. default:
  86. return мФорм.Errorf("Литера.типУст(): неизвестный тип руны('%v')", string(сам.знач))
  87. }
  88. return nil
  89. }
  90. // Знач -- возвращает хранимое значение руны
  91. func (сам *Литера) Знач() мАлиас.Литера {
  92. return мАлиас.Литера(сам.знач)
  93. }
  94. // Тип -- возвращае ттип руны
  95. func (сам *Литера) Тип() мАлиас.ЛитераТип {
  96. return сам.тип
  97. }