prc_res.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // package prc_res -- обработка результата
  2. package prc_res
  3. import (
  4. "fmt"
  5. "log"
  6. "strconv"
  7. "strings"
  8. "plt/lev2/vm/ctx_base"
  9. "plt/lev2/vm/ctx_int"
  10. "plt/lev2/vm/pos"
  11. "plt/lev2/vm/state_res"
  12. "plt/lev2/vm/state_vm"
  13. )
  14. // PrcRes -- обработка результата
  15. type PrcRes struct {
  16. ctx_base.CtxBase
  17. Run func() // Функция процесса инструкций ВМ
  18. }
  19. var (
  20. vmState = state_vm.VM_State
  21. posCur = pos.PosCur
  22. )
  23. // NewPrcRes -- возвращает новый обработчик результата
  24. func NewPrcRes() *PrcRes {
  25. log.Println("NewPrcRes()")
  26. sf := &PrcRes{}
  27. sf.parse()
  28. return sf
  29. }
  30. // Парсит строку исходного кода
  31. func (sf *PrcRes) parse() {
  32. begPosX := 0
  33. begPosY := 0
  34. { // Начать поиск присвоения
  35. for vmState.StrCur() != "(" {
  36. vmState.RuneInc()
  37. if vmState.StrCur() == "\n" {
  38. posCur.NextLine()
  39. }
  40. posCur.IncX()
  41. begPosY = posCur.GetY()
  42. }
  43. // Сдвинуть позицию
  44. vmState.RuneInc()
  45. posCur.IncX()
  46. begPosX = posCur.GetX()
  47. }
  48. out := ""
  49. { // Выбрать значение отладки
  50. for vmState.StrCur() != ")" {
  51. strCur := vmState.StrCur()
  52. if strCur == "\n" {
  53. posCur.NextLine()
  54. }
  55. out += vmState.StrNext()
  56. posCur.IncX()
  57. if vmState.IsEnd() {
  58. break
  59. }
  60. }
  61. vmState.RuneInc() // Сдвиг после скобки
  62. out = strings.ReplaceAll(out, "\n\n", "")
  63. }
  64. { // Теперь надо выяснить операцию
  65. out = sf.StripOut(out)
  66. resTypeCompile := vmState.ResCompile().Type()
  67. switch resTypeCompile {
  68. case state_res.ResTypeInt:
  69. sf.compileInt(begPosY, begPosX, out)
  70. default:
  71. err := fmt.Errorf("PrcRes.parse():Неизвестный тип результата, type=%q", resTypeCompile)
  72. panic(err)
  73. }
  74. }
  75. }
  76. // Готовит инструкцию присвоения целочисленного значения
  77. func (sf *PrcRes) compileInt(x, y int, op1 string) {
  78. // Проверить на наличие имени
  79. _, isOk := ctx_int.DictCompile[op1]
  80. { // Если это значение
  81. if !isOk { // Проверяем на число
  82. val, err := strconv.Atoi(op1)
  83. if err != nil {
  84. err := fmt.Errorf("PrcRes.compileInt(): op=%s, err=\n\t%w", op1, err)
  85. panic(err)
  86. }
  87. sf.Run = func() {
  88. resType := vmState.ResRun().Type()
  89. if resType != state_res.ResTypeInt {
  90. err := fmt.Errorf("PrcRes.compileInt(): for val(%v), resType=%v, not int", val, resType)
  91. panic(err)
  92. }
  93. vmState.ResRun().Set(state_res.ResTypeInt, val)
  94. fmt.Printf("%v:%v\tr(%v)\t#(val=%v)\n", x, y, val, val)
  95. }
  96. return
  97. }
  98. }
  99. { // Если это имя
  100. sf.Run = func() {
  101. resType := vmState.ResRun().Type()
  102. if resType != state_res.ResTypeInt {
  103. err := fmt.Errorf("PrcRes.compileInt(): for name(%v), resType=%v, not int", op1, resType)
  104. panic(err)
  105. }
  106. val := ctx_int.DictRun[op1]
  107. val = vmState.ResRun().Get().(int)
  108. ctx_int.DictRun[op1] = val
  109. fmt.Printf("%v:%v\tr(%v)\t#(val=%v)\n", x, y, op1, val)
  110. }
  111. }
  112. }