| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // package vm -- интерпретатор промежуточного языка
- package vm
- import (
- "fmt"
- "log"
- "os"
- // "plt/lev0/spec"
- "plt/lev2/vm/ctx_int"
- "plt/lev2/vm/pos"
- "plt/lev2/vm/prc_comment"
- "plt/lev2/vm/prc_debug"
- "plt/lev2/vm/prc_res"
- "plt/lev2/vm/state_vm"
- )
- // Vm -- интерпретатор промежуточного языка
- type Vm struct {
- lstPrc []func() // Функция процесса инструкций ВМ
- ctxInt *ctx_int.CtxInt // Контекст целых чисел
- }
- var (
- vmState = state_vm.VM_State // Статус ВМ
- posCur = pos.PosCur // Текущая позиция в коде
- )
- // NewVm -- возвращает новый интерпретатор промежуточного языка
- func NewVm() *Vm {
- log.Println("NewVm()")
- path := os.Getenv("MAIN_PROLET")
- if path == "" {
- path = "./main.pli"
- }
- log.Printf("NewVm(): path=%q", path)
- // path := "main.pli"
- // path := "main.pl
- binCode, err := os.ReadFile(path)
- if err != nil {
- log.Panicf("NewVM(): in read path, path=%q, err=\n\t%v", path, err)
- }
- sf := &Vm{
- lstPrc: []func(){},
- ctxInt: ctx_int.NewCtxInt(),
- }
- vmState.CodeStrSet(string(binCode))
- sf.parse() // парсинг кода, заполнение структуры s
- return sf
- }
- // Парсит код на промежуточном языке
- func (sf *Vm) parse() {
- log.Printf("Vm.parse(): len=%v,\n", vmState.RuneLen())
- for vmState.RuneLen() > vmState.IndRune() {
- r := vmState.StrCur()
- // fmt.Printf("%v", string(r))
- switch r {
- case "#": // Поиск коммента
- vmState.RuneInc()
- prcComment := prc_comment.NewPrcComment()
- sf.lstPrc = append(sf.lstPrc, prcComment.Run)
- case "debug": // Поиск отладки
- prcDebug := prc_debug.NewPrcDebug()
- sf.lstPrc = append(sf.lstPrc, prcDebug.Run)
- case "int": // Поиск операции с целым числым
- symInt := sf.ctxInt.CreateSym()
- sf.lstPrc = append(sf.lstPrc, symInt.Run)
- case "reg": // Установка результата
- prcRes := prc_res.NewPrcRes()
- sf.lstPrc = append(sf.lstPrc, prcRes.Run)
- case "\n": // Поиск перевода строки
- posCur.NextLine()
- vmState.RuneInc()
- default: // Дефолтное действие
- fmt.Print(string(r))
- vmState.RuneInc()
- }
- }
- fmt.Printf("\n%v PARSE END\n", posCur)
- }
- // Run -- запускает интерпретатор промежуточного языка
- func (sf *Vm) Run() {
- log.Println("Vm.Run()")
- for _, fnRun := range sf.lstPrc {
- fnRun()
- }
- fmt.Println("")
- }
|