Browse Source

Full cratera support

cratera
SoniEx2 1 year ago
parent
commit
5aa22fbbb1
2 changed files with 52 additions and 21 deletions
  1. +51
    -20
      dirtycompiler.lua
  2. +1
    -1
      tests.cratera

+ 51
- 20
dirtycompiler.lua View File

@@ -160,14 +160,8 @@ defs[parser.FALLBACK] = function(state, token)
-- figure out whether we're in funcname
local i = results.n - 1 -- skip the ':'
local find_statement = true
--while is_tk(results, i, '\n') do -- ignore newlines
-- i = i - 1
--end
i = ignore_newlines(results, i)
while results[i-1] == TK.NAME do
--while is_tk(results, i-2, '\n') do -- ignore newlines
-- i = i - 1
--end
i = ignore_newlines(results, i-2) + 2
if is_tk(results, i-2, '.') then
-- keep going
@@ -194,9 +188,6 @@ defs[parser.FALLBACK] = function(state, token)
end
if find_statement then
while true do
--while is_tk(results, i, '\n') do -- ignore newlines
-- i = i - 1
--end
i = ignore_newlines(results, i)
if is_tk(results, i, ')') then
-- (prefixexp) or (funcargs)
@@ -208,6 +199,8 @@ defs[parser.FALLBACK] = function(state, token)
depth = depth - 1
elseif is_tk(results, i, ')') then
depth = depth + 1
elseif not results[i] then
error("syntax error (unbalanced '()')")
end
until depth == 0
elseif is_tk(results, i, ']') then
@@ -220,6 +213,8 @@ defs[parser.FALLBACK] = function(state, token)
depth = depth - 1
elseif is_tk(results, i, ']') then
depth = depth + 1
elseif not results[i] then
error("syntax error (unbalanced '[]')")
end
until depth == 0
elseif results[i-1] == TK.NAME then
@@ -243,6 +238,8 @@ defs[parser.FALLBACK] = function(state, token)
depth = depth - 1
elseif is_tk(results, newi, ']') then
depth = depth + 1
elseif not results[i] then
error("syntax error (unbalanced '{}')")
end
until depth == 0
local checki = ignore_newlines(results, newi-1)
@@ -328,7 +325,6 @@ defs[parser.FALLBACK] = function(state, token)
local tk_mytrait = i-1
i = ignore_newlines(results, i-2)
if results[i-1] == END_OF_STMT then
assert(token == '(', "unimplemented")
-- definitely cratera (stmt ':' Name '.' Name '(')
-- convert into '(' stmt ',' String ',' String
-- convert names into strings
@@ -344,13 +340,14 @@ defs[parser.FALLBACK] = function(state, token)
depth = depth - 1
elseif is_tk(results, i, ']') then
depth = depth + 1
elseif not results[i] then
error("syntax error (unbalanced '[]')")
end
until depth == 0
local tk_left = i
i = ignore_newlines(results, i-1)
if results[i-1] == END_OF_STMT then
assert(token == '(', "unimplemented")
-- definitely cratera (':' '[' exp ']' '.' Name '(')
-- definitely cratera (stmt ':' '[' exp ']' '.' Name '(')
-- convert into '(' stmt ',' '(' exp ')' ',' String
-- replace '[' and ']'
results[tk_right] = ')'
@@ -359,6 +356,7 @@ defs[parser.FALLBACK] = function(state, token)
end -- else not cratera
end
if inject_cratera then
--assert(token == '(', "unimplemented")
-- convert name into string
results[tk_myfunction] = TK.STRING
-- replace '.' with ','
@@ -370,8 +368,16 @@ defs[parser.FALLBACK] = function(state, token)
results.n = results.n - 2
-- replace ':' with ','
results[ignore_newlines(results, i-2)] = ','
-- replace START_OF_STMT with '(', and '(' with ','
results[pos], results[results.n] = '(', ','
-- replace START_OF_STMT with '('
results[pos] = '('
if token == '(' then
-- replace '(' with ','
results[results.n] = ','
else
-- insert ',' before argument
table.insert(results, results.n, ',')
results.n = results.n + 1
end
-- inject cratera
table.insert(results, pos, ')')
table.insert(results, pos, CRATERA_FUNCTION)
@@ -386,19 +392,38 @@ defs[parser.FALLBACK] = function(state, token)
results.n = results.n + 1
end
results.n = results.n + 3
-- tag it for '(' ')' (no argument) calls
-- tag it so we know to insert a ')' to close our '('
-- and to handle '(' ')' (no argument) calls
-- we add the tag before TK.STRING/'{'/','
table.insert(results, results.n, END_OF_CRATERA)
results.n = results.n + 1
results[results.n] = END_OF_CRATERA
end
end -- else not cratera
end
elseif token == '}' then
-- TODO unimplemented
local i = results.n -- we'll be subtracting anyway, see below
local depth = 1
repeat
i = i - 1
if is_tk(results, i, '{') then
depth = depth - 1
elseif is_tk(results, i, '}') then
depth = depth + 1
elseif not results[i] then
error("syntax error (unbalanced '{}')")
end
until depth == 0
assert(is_tk(results, i, '{'))
if results[i-1] == END_OF_CRATERA then
-- need to add ')' to close our '('
table.remove(results, i-1)
results[results.n] = ')'
end
elseif token == ')' then
local i = results.n - 1 -- skip the ')'
i = ignore_newlines(results, i)
if results[i] == END_OF_CRATERA then
-- '(' CRATERA_FUNCTION ')' '(' something ',' END_OF_CRATERA ')'
if results[i] == ',' and results[i-1] == END_OF_CRATERA then
-- '(' CRATERA_FUNCTION ')' '(' something END_OF_CRATERA ',' ')'
-- need to fix it up into
-- '(' CRATERA_FUNCTION ')' '(' something ')'
table.remove(results, i-1)
@@ -419,11 +444,17 @@ defs[parser.FALLBACK] = function(state, token)
results.n = results.n - 1
break
elseif not results[i] then
error("syntax error")
error("syntax error (unbalanced '()')")
end
until depth == 0
end
end
else -- we skipped a string literal
if results[results.n-1] == TK.STRING and results[results.n-2] == END_OF_CRATERA then
-- need to add ')' to close our '('
table.remove(results, results.n-2)
results[results.n] = ')'
end
end
results.skip = EXTRA_DATA[token]
return SELF


+ 1
- 1
tests.cratera View File

@@ -8,7 +8,7 @@ t.tt = t
t[T] = t
t.f = print
t.ff = print
t.g = function(a) print(a[1]) end
t.g = function(self, a) print(self, a[1]) end
t[F] = print
local _f="f"
local _t="t"


Loading…
Cancel
Save