From 83ceb49b474302acd82ef7a8995c21b51631d483 Mon Sep 17 00:00:00 2001 From: refaktor Date: Thu, 15 Aug 2024 16:24:35 +0200 Subject: [PATCH] adding wip translation from Rye to Eyr --- evaldo/translator_eyr.go | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 evaldo/translator_eyr.go diff --git a/evaldo/translator_eyr.go b/evaldo/translator_eyr.go new file mode 100644 index 00000000..840e61dc --- /dev/null +++ b/evaldo/translator_eyr.go @@ -0,0 +1,62 @@ +package evaldo + +import ( + "fmt" + + "github.com/refaktor/rye/env" +) + +func CompileWord(block *env.Block, ps *env.ProgramState, word env.Word, eyrBlock *env.Block) { + // LOCAL FIRST + found, object, _ := findWordValue(ps, word) + pos := ps.Ser.GetPos() + if found { + switch obj := object.(type) { + case env.Integer: + eyrBlock.Series.Append(obj) + case env.Builtin: + for i := 0; i < obj.Argsn; i++ { + // fmt.Println("**") + block = CompileStepRyeToEyr(block, ps, eyrBlock) + } + eyrBlock.Series.Append(word) + } + } else { + ps.ErrorFlag = true + if !ps.FailureFlag { + ps.Ser.SetPos(pos) + ps.Res = env.NewError2(5, "word not found: "+word.Print(*ps.Idx)) + } + } +} + +func CompileRyeToEyr(block *env.Block, ps *env.ProgramState, eyrBlock *env.Block) *env.Block { + for block.Series.Pos() < block.Series.Len() { + block = CompileStepRyeToEyr(block, ps, eyrBlock) + } + return block +} + +func CompileStepRyeToEyr(block *env.Block, ps *env.ProgramState, eyrBlock *env.Block) *env.Block { + // for block.Series.Pos() < block.Series.Len() { + switch xx := block.Series.Pop().(type) { + case env.Word: + // fmt.Println("W") + CompileWord(block, ps, xx, eyrBlock) + // get value of word + // if function + // get argnum + // add argnum args to mstack (values, words or compiled expressions (recur)) + // add word to mstack + // else add word to value list + case env.Opword: + fmt.Println("O") + case env.Pipeword: + fmt.Println("P") + case env.Integer: + // fmt.Println("I") + eyrBlock.Series.Append(xx) + } + // } + return block +}