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