| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // package state_vm -- статус ВМ
- package state_vm
- import (
- "plt/lev2/vm/state_res"
- "strings"
- )
- // StateVm -- статус ВМ
- type StateVm struct {
- codeStr string // Инструкци ив строке
- codeRune []rune // Инструкции в рунах
- indRune int // Указатель на текущую руну в промежуточном языке
- resComp *state_res.StateRes // Результат при компиляции
- resRun *state_res.StateRes // Результат при исполнении
- }
- var (
- VM_State = &StateVm{
- resComp: state_res.NewStateRes(),
- resRun: state_res.NewStateRes(),
- }
- )
- // 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 {
- return string(sf.codeRune[sf.indRune])
- }
- // 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)
- }
|