compiler.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // package compiler -- главный тип сервиса компилятора
  2. package compiler
  3. import (
  4. мФорм "fmt"
  5. мЛог "log"
  6. мОс "os"
  7. "p78git.ddns.net/svi/odeft/internal/module/src_rune"
  8. "p78git.ddns.net/svi/odeft/internal/syntax"
  9. )
  10. // Компилятор -- главный тип сервиса компилятора
  11. type Компилятор struct {
  12. syntax *syntax.Синтаксис
  13. }
  14. // НовКомпилятор -- возвращает новый тип компилятора
  15. func НовКомпилятор() (*Компилятор, error) {
  16. мЛог.Printf("НовКомпилятор()\n")
  17. сам := &Компилятор{}
  18. исхГлавИмя, ош := сам.главМодульПолуч()
  19. if ош != nil {
  20. return nil, мФорм.Errorf("НовКомпилятор(): при получении главного модуля, ош\n\t%w", ош)
  21. }
  22. исхГлавТекст, ош := сам.исхГлавЧитать(исхГлавИмя)
  23. if ош != nil {
  24. return nil, мФорм.Errorf("НовКомпилятор(): in read main module(%v), ош=\n\t%w", исхГлавТекст, ош)
  25. }
  26. _, ош = сам.руныКлассифицировать(исхГлавТекст)
  27. if ош != nil {
  28. return nil, мФорм.Errorf("НовКомпилятор(): при классификации рун главного модуля(%v), ош=\n\t%w", исхГлавИмя, ош)
  29. }
  30. runeSrc := []rune(исхГлавТекст)
  31. сам.syntax, ош = syntax.НовСинтаксис(runeSrc)
  32. if ош != nil {
  33. return nil, мФорм.Errorf("НовКомпилятор(): при создании Синтаксис, ош=\n\t%w", ош)
  34. }
  35. return сам, nil
  36. }
  37. // Пуск -- запускает компилятор в работу
  38. func (сам *Компилятор) Пуск() error {
  39. мЛог.Printf("Компилятор.Пуск()\n")
  40. if ош := сам.syntax.Пуск(); ош != nil {
  41. return мФорм.Errorf("Компилятор.Пуск(): при работе Синтаксис в главном модуле, ош=\n\t%w", ош)
  42. }
  43. return nil
  44. }
  45. // Читает содержимое главного модуля
  46. func (sf *Компилятор) исхГлавЧитать(исхГлавИмя string) (string, error) {
  47. бинДанные, ош := мОс.ReadFile(исхГлавИмя)
  48. if ош != nil {
  49. sf.printHelp()
  50. return "", мФорм.Errorf("Компилятор.исхГлавЧитать(): при чтении главного модуля(%v), ош=\n\t%w", исхГлавИмя, ош)
  51. }
  52. return string(бинДанные), nil
  53. }
  54. // Получает главный модуль программы из окружния для компиляции
  55. func (sf *Компилятор) главМодульПолуч() (string, error) {
  56. мЛог.Printf("Компилятор.главМодульПолуч()\n")
  57. исхГлавИмя := мОс.Getenv("SRC_MAIN")
  58. if исхГлавИмя == "" {
  59. sf.printHelp()
  60. return "", мФорм.Errorf("Компилятор.главМодульПолуч(): env SRC_MAIN not set")
  61. }
  62. return исхГлавИмя, nil
  63. }
  64. const (
  65. справкаПоЗапуску = `Оберон-У компилятор. 2023 г. BSD-2
  66. Для запуска компилятора необходимо определить переменную окружения:
  67. export SRC_MAIN="./main.ou"
  68. Для подробной справки о языке смотрите тут:
  69. http://p78git.ddns.net/svi/odeft
  70. `
  71. )
  72. // Печатает справку по использованию
  73. func (sf *Компилятор) printHelp() {
  74. мЛог.Print(справкаПоЗапуску)
  75. }
  76. // Классифицирует руны исходника
  77. func (сам *Компилятор) руныКлассифицировать(текстИсх string) ([]src_rune.ИсхРуна, error) {
  78. return nil, мФорм.Errorf("Компилятор.руныКлассифицировать(): доделать")
  79. }