diff --git a/CoreHelpers.tl b/CoreHelpers.tl index fffc380..fad1f1f 100644 --- a/CoreHelpers.tl +++ b/CoreHelpers.tl @@ -172,6 +172,54 @@ function CoreHelpers.searchDictionaries(e: Environment, token: string): WordInfo end end +function selectRecXT(env: Environment): function(Environment) + local dataStack = env.activeDataStack + if env.compileState then + dataStack:pop() + local selected = dataStack:pop() + dataStack:pop() + return selected as function(Environment) + else + dataStack:pop() + dataStack:pop() + return dataStack:pop() as function(Environment) + end +end + + + +function CoreHelpers.interpreters_outer(env: Environment) + local dataStack = env.activeDataStack + CoreHelpers.skipWhitespace(env) + local token: string | nil = CoreHelpers.parseToken(env) + if not token then + env.running = false + return + end + for _, rec in ipairs(env.recognizers) do + dataStack:push(token) + rec(env) + local result = dataStack:pop() as boolean + if not result then + token = dataStack:pop() as string + end + if result then + (selectRecXT(env))(env) + return + end + end + + io.write("\""..token.."\"?\n") +end + +function CoreHelpers.interpreters_inner(env: Environment) + while(env.running) do + env.instructionPointer:deref() as function(Environment)(env) + env.instructionPointer:inc() + end +end + + function CoreHelpers.recWord(env: Environment) local dataStack = CoreHelpers.getActiveDataStack(env) diff --git a/Interpreters.tl b/Interpreters.tl index a068b1a..05a9186 100644 --- a/Interpreters.tl +++ b/Interpreters.tl @@ -13,62 +13,13 @@ end function Interpreters.start(env: Environment) table.insert(env.dictionaries, CoreWords) local interpreterInstructions = {} - table.insert(interpreterInstructions, Interpreters.outer) + table.insert(interpreterInstructions, helpers.interpreters_outer) table.insert(interpreterInstructions, helpers.reset) table.insert(env.recognizers, helpers.recNumber) table.insert(env.recognizers, helpers.recWord) local startPointer = Pointer:new() startPointer.referant = interpreterInstructions env.instructionPointer = startPointer - Interpreters.inner(env) + helpers.interpreters_inner(env) end - - -function selectRecXT(env: Environment): function(Environment) - local dataStack = env.activeDataStack - if env.compileState then - dataStack:pop() - local selected = dataStack:pop() - dataStack:pop() - return selected as function(Environment) - else - dataStack:pop() - dataStack:pop() - return dataStack:pop() as function(Environment) - end -end - - -function Interpreters.outer(env: Environment) - local dataStack = env.activeDataStack - skipWhitespace(env) - local token: string | nil = parseToken(env) - if not token then - env.running = false - return - end - for _, rec in ipairs(env.recognizers) do - dataStack:push(token) - rec(env) - local result = dataStack:pop() as boolean - if not result then - token = dataStack:pop() as string - end - if result then - (selectRecXT(env))(env) - return - end - end - - -- We did not recognize the token. - io.write("\""..token.."\"?\n") -end - -function Interpreters.inner(env: Environment) - while(env.running) do - env.instructionPointer:deref() as function(Environment)(env) - env.instructionPointer:inc() - end -end - return Interpreters