state_vm.go 2.1 KB

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