compiler.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // package compiler -- главный тип сервиса компилятора
  2. package compiler
  3. import (
  4. "fmt"
  5. "log"
  6. "os"
  7. "p78git.ddns.net/svi/odeft/internal/syntax"
  8. )
  9. // Compiler -- главный тип сервиса компилятора
  10. type Compiler struct {
  11. syntax *syntax.Syntax
  12. }
  13. // NewCompiler -- возвращает новый тип компилятора
  14. func NewCompiler() (*Compiler, error) {
  15. log.Printf("NewCompiler()\n")
  16. sf := &Compiler{}
  17. srcMain, err := sf.getMainModule()
  18. if err != nil {
  19. return nil, fmt.Errorf("NewCompiler(): in get main module, err=\n\t%w", err)
  20. }
  21. textSrc, err := sf.readMainModule(srcMain)
  22. if err != nil {
  23. return nil, fmt.Errorf("NewCompiler(): in read main module(%v), err=\n\t%w", srcMain, err)
  24. }
  25. runeSrc := []rune(textSrc)
  26. sf.syntax, err = syntax.NewSyntax(runeSrc)
  27. if err != nil {
  28. return nil, fmt.Errorf("NewCompiler(): in create Syntax, err=\n\t%w", err)
  29. }
  30. return sf, nil
  31. }
  32. // Run -- запускает компилятор в работу
  33. func (sf *Compiler) Run() error {
  34. log.Printf("Compiler.Run()\n")
  35. if err := sf.syntax.Run(); err != nil {
  36. return fmt.Errorf("Compiler.Run(): in work main syntax, err=\n\t%w", err)
  37. }
  38. return nil
  39. }
  40. // Читает содержимое главного модуля
  41. func (sf *Compiler) readMainModule(srcName string) (string, error) {
  42. binData, err := os.ReadFile(srcName)
  43. if err != nil {
  44. sf.printHelp()
  45. return "", fmt.Errorf("Compiler.readMainModule(): in read srcMain(%v), err=\n\t%w", srcName, err)
  46. }
  47. return string(binData), nil
  48. }
  49. // Получает главный модуль программы из окружния для компиляции
  50. func (sf *Compiler) getMainModule() (string, error) {
  51. log.Printf("Compiler.getMainModule()\n")
  52. srcMain := os.Getenv("SRC_MAIN")
  53. if srcMain == "" {
  54. sf.printHelp()
  55. return "", fmt.Errorf("Compiler.getMainModule(): env SRC_MAIN not set")
  56. }
  57. return srcMain, nil
  58. }
  59. const (
  60. help = `Оберон-У компилятор. 2023 г. BSD-2
  61. Для запуска компилятора необходимо определить переменную окружения:
  62. export SRC_MAIN="./main.obu"
  63. Для подробной справки о языке смотрите тут:
  64. http://p78git.ddns.net/svi/odeft
  65. `
  66. )
  67. // Печатает справку по использованию
  68. func (sf *Compiler) printHelp() {
  69. log.Print(help)
  70. }