litera.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // package litera -- руна исходника
  2. package litera
  3. import (
  4. мФорм "fmt"
  5. мЮникод "unicode"
  6. мАлиас "p78git.ddns.net/svi/odeft/pkg/alias"
  7. мКонст "p78git.ddns.net/svi/odeft/pkg/cons"
  8. )
  9. // Литера -- руна исходника
  10. type Литера struct {
  11. знач мАлиас.Литера // Хранимая руна
  12. тип мАлиас.РунаТип // Тип руны
  13. }
  14. // НовЛитера -- возвращает новую литеру
  15. func НовЛитера(литера мАлиас.Литера) (*Литера, error) {
  16. if литера == "" {
  17. return nil, мФорм.Errorf("НовЛитера(): литера пустая")
  18. }
  19. сам := &Литера{
  20. знач: литера,
  21. }
  22. if ош := сам.типУст(); ош != nil {
  23. return nil, мФорм.Errorf("НовЛитера(): при проверке типа, ош=\n\t%w", ош)
  24. }
  25. return сам, nil
  26. }
  27. // Устанавливает тип руны
  28. func (сам *Литера) типУст() error {
  29. руна := []rune(сам.знач)[0]
  30. switch {
  31. case мЮникод.IsLetter(руна):
  32. сам.тип = мКонст.Буква
  33. case мЮникод.IsDigit(руна):
  34. сам.тип = мКонст.Цифра
  35. case сам.знач == " ":
  36. сам.тип = мКонст.Разделитель
  37. case сам.знач == ".":
  38. сам.тип = мКонст.Точка
  39. case сам.знач == "\n":
  40. сам.тип = мКонст.ПереводСтроки
  41. case сам.знач == "-":
  42. сам.тип = мКонст.Дефис
  43. case сам.знач == ":":
  44. сам.тип = мКонст.Двоеточие
  45. case сам.знач == "#":
  46. сам.тип = мКонст.КомментСтроч
  47. case сам.знач == "=":
  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. default:
  78. return мФорм.Errorf("Литера.типУст(): неизвестный тип руны('%v')", string(сам.знач))
  79. }
  80. return nil
  81. }
  82. // Знач -- возвращает хранимое значение руны
  83. func (сам *Литера) Знач() мАлиас.Литера {
  84. return мАлиас.Литера(сам.знач)
  85. }
  86. // Тип -- возвращае ттип руны
  87. func (сам *Литера) Тип() мАлиас.РунаТип {
  88. return сам.тип
  89. }