| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- // 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)
- }
- }
- }
|