// package prc_res -- обработка результата package prc_res import ( "fmt" "log" "strconv" "strings" "plt/lev2/vm/ctx_base" "plt/lev2/vm/ctx_int" "plt/lev2/vm/pos" "plt/lev2/vm/state_res" "plt/lev2/vm/state_vm" ) // PrcRes -- обработка результата type PrcRes struct { ctx_base.CtxBase Run func() // Функция процесса инструкций ВМ } var ( vmState = state_vm.VM_State posCur = pos.PosCur ) // NewPrcRes -- возвращает новый обработчик результата func NewPrcRes() *PrcRes { log.Println("NewPrcRes()") sf := &PrcRes{} sf.parse() return sf } // Парсит строку исходного кода func (sf *PrcRes) parse() { begPosX := 0 begPosY := 0 { // Начать поиск присвоения for vmState.StrCur() != "(" { vmState.RuneInc() if vmState.StrCur() == "\n" { posCur.NextLine() } posCur.IncX() begPosY = posCur.GetY() } // Сдвинуть позицию vmState.RuneInc() posCur.IncX() begPosX = posCur.GetX() } out := "" { // Выбрать значение отладки for vmState.StrCur() != ")" { strCur := vmState.StrCur() if strCur == "\n" { posCur.NextLine() } out += vmState.StrNext() posCur.IncX() if vmState.IsEnd() { break } } vmState.RuneInc() // Сдвиг после скобки out = strings.ReplaceAll(out, "\n\n", "") } { // Теперь надо выяснить операцию out = sf.StripOut(out) resTypeCompile := vmState.ResCompile().Type() switch resTypeCompile { case state_res.ResTypeInt: sf.compileInt(begPosY, begPosX, out) default: err := fmt.Errorf("PrcRes.parse():Неизвестный тип результата, type=%q", resTypeCompile) panic(err) } } } // Готовит инструкцию присвоения целочисленного значения func (sf *PrcRes) compileInt(x, y int, op1 string) { // Проверить на наличие имени _, isOk := ctx_int.DictCompile[op1] { // Если это значение if !isOk { // Проверяем на число val, err := strconv.Atoi(op1) if err != nil { err := fmt.Errorf("PrcRes.compileInt(): op=%s, err=\n\t%w", op1, err) panic(err) } sf.Run = func() { resType := vmState.ResRun().Type() if resType != state_res.ResTypeInt { err := fmt.Errorf("PrcRes.compileInt(): for val(%v), resType=%v, not int", val, resType) panic(err) } vmState.ResRun().Set(state_res.ResTypeInt, val) fmt.Printf("%v:%v\tr(%v)\t#(val=%v)\n", x, y, val, val) } return } } { // Если это имя sf.Run = func() { resType := vmState.ResRun().Type() if resType != state_res.ResTypeInt { err := fmt.Errorf("PrcRes.compileInt(): for name(%v), resType=%v, not int", op1, resType) panic(err) } val := ctx_int.DictRun[op1] val = vmState.ResRun().Get().(int) ctx_int.DictRun[op1] = val fmt.Printf("%v:%v\tr(%v)\t#(val=%v)\n", x, y, op1, val) } } }