state_vm.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // package state_vm -- статус ВМ
  2. package state_vm
  3. import (
  4. "plt/lev2/vm/pos"
  5. "plt/lev2/vm/state_res"
  6. "strings"
  7. )
  8. // StateVm -- статус ВМ
  9. type StateVm struct {
  10. codeStr string // Инструкци ив строке
  11. codeRune []rune // Инструкции в рунах
  12. indRune int // Указатель на текущую руну в промежуточном языке
  13. resComp *state_res.StateRes // Результат при компиляции
  14. resRun *state_res.StateRes // Результат при исполнении
  15. posCur pos.IPosMut // Текущая позиция
  16. }
  17. var (
  18. VM_State = &StateVm{
  19. resComp: state_res.NewStateRes(),
  20. resRun: state_res.NewStateRes(),
  21. posCur: pos.PosCur,
  22. }
  23. )
  24. // ResCompile -- результат при компиляции
  25. func (sf *StateVm) ResCompile() *state_res.StateRes {
  26. return sf.resComp
  27. }
  28. // ResRun -- результат при исполнении
  29. func (sf *StateVm) ResRun() *state_res.StateRes {
  30. return sf.resRun
  31. }
  32. // CodeStrSet -- одноразовое внедрение кода
  33. func (sf *StateVm) CodeStrSet(codeStr string) {
  34. sf.codeStr = codeStr
  35. sf.codeRune = []rune(sf.codeStr)
  36. }
  37. // RuneInc -- инкремент индекса текущей руны
  38. func (sf *StateVm) RuneInc() {
  39. sf.indRune++
  40. }
  41. // IndRune -- текущий индекс
  42. func (sf *StateVm) IndRune() int {
  43. return sf.indRune
  44. }
  45. // StrCur - литера по текущемй индексу
  46. func (sf *StateVm) StrCur() string {
  47. out := ""
  48. for _, indRune := range sf.codeRune {
  49. if indRune == '(' {
  50. break
  51. }
  52. out += string(indRune)
  53. }
  54. return out
  55. }
  56. // StrNext -- возвращает следующую литеру
  57. func (sf *StateVm) StrNext() string {
  58. defer func() {
  59. sf.indRune++
  60. }()
  61. runeNext := sf.codeRune[sf.indRune]
  62. return string(runeNext)
  63. }
  64. // RuneLen -- количество рун
  65. func (sf *StateVm) RuneLen() int {
  66. return len(sf.codeRune)
  67. }
  68. // IsEnd -- проверка на конец рун
  69. func (sf *StateVm) IsEnd() bool {
  70. return sf.indRune >= len(sf.codeRune)-1
  71. }
  72. // LstLast -- возвращает последню часть инструкций
  73. func (sf *StateVm) LstLast(lit string) []string {
  74. return strings.Split(string(sf.codeRune[sf.indRune:]), lit)
  75. }