// package state_vm -- статус ВМ package state_vm import ( "plt/lev2/vm/pos" "plt/lev2/vm/state_res" "strings" ) // StateVm -- статус ВМ type StateVm struct { codeStr string // Инструкци ив строке codeRune []rune // Инструкции в рунах indRune int // Указатель на текущую руну в промежуточном языке resComp *state_res.StateRes // Результат при компиляции resRun *state_res.StateRes // Результат при исполнении posCur pos.IPosMut // Текущая позиция } var ( VM_State = &StateVm{ resComp: state_res.NewStateRes(), resRun: state_res.NewStateRes(), posCur: pos.PosCur, } ) // ResCompile -- результат при компиляции func (sf *StateVm) ResCompile() *state_res.StateRes { return sf.resComp } // ResRun -- результат при исполнении func (sf *StateVm) ResRun() *state_res.StateRes { return sf.resRun } // CodeStrSet -- одноразовое внедрение кода func (sf *StateVm) CodeStrSet(codeStr string) { sf.codeStr = codeStr sf.codeRune = []rune(sf.codeStr) } // RuneInc -- инкремент индекса текущей руны func (sf *StateVm) RuneInc() { sf.indRune++ } // IndRune -- текущий индекс func (sf *StateVm) IndRune() int { return sf.indRune } // StrCur - литера по текущемй индексу func (sf *StateVm) StrCur() string { out := "" for _, indRune := range sf.codeRune { if indRune == '(' { break } out += string(indRune) } return out } // StrNext -- возвращает следующую литеру func (sf *StateVm) StrNext() string { defer func() { sf.indRune++ }() runeNext := sf.codeRune[sf.indRune] return string(runeNext) } // RuneLen -- количество рун func (sf *StateVm) RuneLen() int { return len(sf.codeRune) } // IsEnd -- проверка на конец рун func (sf *StateVm) IsEnd() bool { return sf.indRune >= len(sf.codeRune)-1 } // LstLast -- возвращает последню часть инструкций func (sf *StateVm) LstLast(lit string) []string { return strings.Split(string(sf.codeRune[sf.indRune:]), lit) }