compiler.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. return nil
  36. }
  37. // Читает содержимое главного модуля
  38. func (sf *Compiler) readMainModule(srcName string) (string, error) {
  39. binData, err := os.ReadFile(srcName)
  40. if err != nil {
  41. sf.printHelp()
  42. return "", fmt.Errorf("Compiler.readMainModule(): in read srcMain(%v), err=\n\t%w", srcName, err)
  43. }
  44. return string(binData), nil
  45. }
  46. // Получает главный модуль программы из окружния для компиляции
  47. func (sf *Compiler) getMainModule() (string, error) {
  48. log.Printf("Compiler.getMainModule()\n")
  49. srcMain := os.Getenv("SRC_MAIN")
  50. if srcMain == "" {
  51. sf.printHelp()
  52. return "", fmt.Errorf("Compiler.getMainModule(): env SRC_MAIN not set")
  53. }
  54. return srcMain, nil
  55. }
  56. const (
  57. help = `Оберон-У компилятор. 2023 г. BSD-2
  58. Для запуска компилятора необходимо определить переменную окружения:
  59. export SRC_MAIN="./main.obu"
  60. Для подробной справки о языке смотрите тут:
  61. http://p78git.ddns.net/svi/odeft
  62. `
  63. )
  64. // Печатает справку по использованию
  65. func (sf *Compiler) printHelp() {
  66. log.Print(help)
  67. }