prc_debug.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // package prc_debug -- процесс отладки
  2. package prc_debug
  3. import (
  4. "fmt"
  5. "log"
  6. "strings"
  7. "plt/lev2/vm/pos"
  8. "plt/lev2/vm/state_vm"
  9. )
  10. // PrcDebug -- процесс для отладки
  11. type PrcDebug struct {
  12. strOut string
  13. }
  14. // NewPrcDebug -- возвращает новый процесс для отладки
  15. func NewPrcDebug() *PrcDebug {
  16. log.Println("NewPrcDebug()")
  17. sf := &PrcDebug{}
  18. sf.parse()
  19. return sf
  20. }
  21. // Парсит инструкции ,вырезает действие
  22. func (sf *PrcDebug) parse() {
  23. vmState := state_vm.VM_State
  24. posCur := pos.PosCur
  25. begPosX := 0
  26. begPosY := pos.PosCur.GetY()
  27. { // Начать поиск выводимого значения
  28. for vmState.StrCur() != "(" {
  29. vmState.RuneInc()
  30. if vmState.StrCur() == "\n" {
  31. posCur.NextLine()
  32. }
  33. posCur.IncX()
  34. }
  35. // Сдвинуть позицию
  36. vmState.RuneInc()
  37. posCur.IncX()
  38. begPosX = posCur.GetX()
  39. }
  40. { // Выбрать значение отладки
  41. out := ""
  42. for vmState.StrCur() != ")" {
  43. strCur := vmState.StrCur()
  44. if strCur == "\n" {
  45. posCur.NextLine()
  46. }
  47. out += vmState.StrNext()
  48. posCur.IncX()
  49. if vmState.IsEnd() {
  50. break
  51. }
  52. }
  53. vmState.RuneInc() // Сдвиг после скобки
  54. out = strings.ReplaceAll(out, "\n\n", "\n")
  55. // if out[len(out)-1] != '\n' {
  56. // out += "\n"
  57. // }
  58. sf.strOut = fmt.Sprintf("%v:%v\td(%v)\n", begPosY, begPosX, out)
  59. }
  60. }
  61. // Run -- запускает процесс (отладка)
  62. func (sf *PrcDebug) Run() {
  63. fmt.Printf("%v", sf.strOut)
  64. }