vm.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // package vm -- интерпретатор промежуточного языка
  2. package vm
  3. import (
  4. "fmt"
  5. "log"
  6. "os"
  7. // "plt/lev0/spec"
  8. "plt/lev2/vm/pos"
  9. "plt/lev2/vm/prc_comment"
  10. "plt/lev2/vm/prc_debug"
  11. "plt/lev2/vm/prc_int"
  12. "plt/lev2/vm/prc_res"
  13. "plt/lev2/vm/state_vm"
  14. )
  15. // Vm -- интерпретатор промежуточного языка
  16. type Vm struct {
  17. lstPrc []func() // Функция процесса инструкций ВМ
  18. }
  19. // NewVm -- возвращает новый интерпретатор промежуточного языка
  20. func NewVm() *Vm {
  21. log.Println("NewVm()")
  22. path := os.Getenv("MAIN_PROLET")
  23. if path == "" {
  24. path = "./main.pli"
  25. }
  26. log.Printf("NewVm(): path=%q", path)
  27. // path := "main.pli"
  28. // path := "main.pl
  29. binCode, err := os.ReadFile(path)
  30. if err != nil {
  31. log.Panicf("NewVM(): in read path, path=%q, err=\n\t%v", path, err)
  32. }
  33. sf := &Vm{
  34. lstPrc: []func(){},
  35. }
  36. vmState := state_vm.VM_State // Статус ВМ
  37. vmState.CodeStrSet(string(binCode))
  38. sf.parse() // парсинг кода, заполнение структуры s
  39. return sf
  40. }
  41. // Парсит код на промежуточном языке
  42. func (sf *Vm) parse() {
  43. vmState := state_vm.VM_State // Статус ВМ
  44. log.Printf("Vm.parse(): len=%v,\n", vmState.RuneLen())
  45. posCur := pos.PosCur // Текущая позиция в коде
  46. fmt.Println("")
  47. for vmState.RuneLen() > vmState.IndRune() {
  48. r := vmState.StrCur()
  49. // fmt.Printf("%v", string(r))
  50. switch r {
  51. case "#": // Поиск коммента
  52. vmState.RuneInc()
  53. prcComment := prc_comment.NewPrcComment()
  54. sf.lstPrc = append(sf.lstPrc, prcComment.Run)
  55. case "d": // Поиск отладки
  56. prcDebug := prc_debug.NewPrcDebug()
  57. sf.lstPrc = append(sf.lstPrc, prcDebug.Run)
  58. case "i": // Поиск операции с целым числым
  59. prcInt := prc_int.NewPrcInt()
  60. sf.lstPrc = append(sf.lstPrc, prcInt.Run)
  61. case "r": // Установка результата
  62. prcRes := prc_res.NewPrcRes()
  63. sf.lstPrc = append(sf.lstPrc, prcRes.Run)
  64. case "\n": // Поиск перевода строки
  65. posCur.NextLine()
  66. vmState.RuneInc()
  67. default: // Дефолтное действие
  68. fmt.Print(string(r))
  69. vmState.RuneInc()
  70. }
  71. }
  72. fmt.Printf("\n%v PARSE END\n", posCur)
  73. }
  74. // Run -- запускает интерпретатор промежуточного языка
  75. func (sf *Vm) Run() {
  76. log.Println("Vm.Run()")
  77. for _, fnRun := range sf.lstPrc {
  78. fnRun()
  79. }
  80. fmt.Println("")
  81. }