cleanup
This commit is contained in:
parent
04ed7427cd
commit
fe6bc4f8cb
|
@ -83,7 +83,6 @@ end
|
||||||
local function skipWhitespace(state: State)
|
local function skipWhitespace(state: State)
|
||||||
local chr = state.activeInputStream:readCurrentCharacter()
|
local chr = state.activeInputStream:readCurrentCharacter()
|
||||||
while (isWhitespace(state, chr)) do
|
while (isWhitespace(state, chr)) do
|
||||||
print("SKIPPING WHITESPACE")
|
|
||||||
chr = state.activeInputStream:advanceOffset()
|
chr = state.activeInputStream:advanceOffset()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -91,14 +90,10 @@ end
|
||||||
local function parseToken(state: State): string
|
local function parseToken(state: State): string
|
||||||
local chr = state.activeInputStream:readCurrentCharacter()
|
local chr = state.activeInputStream:readCurrentCharacter()
|
||||||
local token = ""
|
local token = ""
|
||||||
print("paresToken called")
|
|
||||||
while(not isWhitespace(state, chr)) do
|
while(not isWhitespace(state, chr)) do
|
||||||
print("parsing....", chr)
|
|
||||||
token = token..chr
|
token = token..chr
|
||||||
chr = state.activeInputStream:advanceOffset()
|
chr = state.activeInputStream:advanceOffset()
|
||||||
print(chr)
|
|
||||||
end
|
end
|
||||||
print("parsed", token)
|
|
||||||
return token
|
return token
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
local WordInfo = require("WordInfo")
|
|
||||||
|
|
||||||
|
|
||||||
local type Dictionary = record
|
|
||||||
contents: {string: WordInfo}
|
|
||||||
end
|
|
||||||
|
|
||||||
function Dictionary:define(word: string, info: WordInfo)
|
|
||||||
self.contents[word] = info
|
|
||||||
end
|
|
||||||
local dict_mt = {__index = Dictionary}
|
|
||||||
function Dictionary:new(): Dictionary
|
|
||||||
return setmetatable({contents = {}} as Dictionary, dict_mt)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return Dictionary
|
|
|
@ -25,23 +25,20 @@ local skipWhitespace = (CoreWords:lookup("skipWhitespace") as WordInfo).func
|
||||||
local parseToken = (CoreWords:lookup("parseToken") as WordInfo).func
|
local parseToken = (CoreWords:lookup("parseToken") as WordInfo).func
|
||||||
|
|
||||||
while(true) do
|
while(true) do
|
||||||
print("NEW LOOP")
|
|
||||||
skipWhitespace(machineState)
|
skipWhitespace(machineState)
|
||||||
local token: string = parseToken(machineState)
|
local token: string = parseToken(machineState)
|
||||||
if isNumber(machineState, token) then
|
if isNumber(machineState, token) then
|
||||||
machineState.activeDataStack:push(tonumber(token))
|
machineState.activeDataStack:push(tonumber(token))
|
||||||
print("ok")
|
|
||||||
else
|
else
|
||||||
for i, dictionary in ipairs(machineState.dictionaries) do
|
for i, dictionary in ipairs(machineState.dictionaries) do
|
||||||
local wordinfo = dictionary:lookup(token)
|
local wordinfo = dictionary:lookup(token)
|
||||||
if wordinfo then
|
if wordinfo then
|
||||||
(wordinfo as WordInfo).func(machineState)
|
(wordinfo as WordInfo).func(machineState)
|
||||||
print("ok")
|
goto continue
|
||||||
goto ok
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
print(string.format('%q ?', token))
|
print(string.format('%q ?', token))
|
||||||
::ok::
|
::continue::
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
28
Stack.tl
28
Stack.tl
|
@ -1,28 +0,0 @@
|
||||||
|
|
||||||
local type Stack = record
|
|
||||||
contents: {any}
|
|
||||||
top: number
|
|
||||||
push: function(Stack, any)
|
|
||||||
pop: function(Stack)
|
|
||||||
new: function(Stack): Stack
|
|
||||||
end
|
|
||||||
function Stack:push(val: any)
|
|
||||||
self.top = self.top + 1
|
|
||||||
table.insert(self.contents,val)
|
|
||||||
end
|
|
||||||
function Stack:pop(): any
|
|
||||||
self.top = self.top -1
|
|
||||||
if self.top < 0 then
|
|
||||||
error("Stack underflow")
|
|
||||||
end
|
|
||||||
return table.remove(self.contents)
|
|
||||||
end
|
|
||||||
local stack_mt = {__index = Stack}
|
|
||||||
function Stack:new(): Stack
|
|
||||||
return setmetatable({contents = {}, top = 0} as Stack, stack_mt)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- operations
|
|
||||||
|
|
||||||
return Stack
|
|
37
State.tl
37
State.tl
|
@ -1,37 +0,0 @@
|
||||||
local Stack = require("Stack")
|
|
||||||
local InputStream = require("InputStream")
|
|
||||||
local Dictionary = require("Dictionary")
|
|
||||||
|
|
||||||
local type State = record
|
|
||||||
dataStacks: {Stack}
|
|
||||||
compilerStack: Stack
|
|
||||||
activeDataStack: Stack
|
|
||||||
interrupts: {function(State)}
|
|
||||||
activeInputStream: InputStream
|
|
||||||
dictionaries: {Dictionary}
|
|
||||||
end
|
|
||||||
|
|
||||||
local state_mt = {__index = State}
|
|
||||||
function State:new(): State
|
|
||||||
return setmetatable(
|
|
||||||
{
|
|
||||||
dataStacks = {},
|
|
||||||
compilerStack = Stack:new()
|
|
||||||
} as State,
|
|
||||||
state_mt)
|
|
||||||
end
|
|
||||||
|
|
||||||
function State:addDataStack(data: Stack)
|
|
||||||
table.insert(self.dataStacks, data)
|
|
||||||
end
|
|
||||||
|
|
||||||
function State:changeCompilerStack(compilerStack: Stack)
|
|
||||||
self.compilerStack = compilerStack
|
|
||||||
end
|
|
||||||
function State:changeActiveDataStack(stackIndex: number)
|
|
||||||
assert(stackIndex <= #self.dataStacks and stackIndex > 0)
|
|
||||||
self.activeDataStack = self.dataStacks[stackIndex]
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
return State
|
|
14
WordInfo.tl
14
WordInfo.tl
|
@ -1,14 +0,0 @@
|
||||||
local State = require("State")
|
|
||||||
|
|
||||||
local type WordInfo = record
|
|
||||||
func: function(State)
|
|
||||||
immediate: boolean
|
|
||||||
end
|
|
||||||
local wordi_mt = {__index = WordInfo}
|
|
||||||
function WordInfo:new(funct: function(State), imm: boolean): WordInfo
|
|
||||||
return setmetatable({func = funct, immediate = imm} as WordInfo, wordi_mt)
|
|
||||||
end
|
|
||||||
|
|
||||||
return WordInfo
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue