diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2016-07-01 22:08:45 -0400 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2016-07-01 22:08:45 -0400 |
| commit | 774b296d3e49b8be3b0feaee8b5d3154fcec73b6 (patch) | |
| tree | e076254b6332c177dc34b4d87bc222f52ca49646 /src/scope.lua | |
| download | glum-774b296d3e49b8be3b0feaee8b5d3154fcec73b6.tar.gz glum-774b296d3e49b8be3b0feaee8b5d3154fcec73b6.tar.bz2 glum-774b296d3e49b8be3b0feaee8b5d3154fcec73b6.zip | |
Initial commit
Diffstat (limited to 'src/scope.lua')
| -rw-r--r-- | src/scope.lua | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/scope.lua b/src/scope.lua new file mode 100644 index 0000000..dd19392 --- /dev/null +++ b/src/scope.lua @@ -0,0 +1,74 @@ +--[[ +This module implements functions that handle scoping rules +]] +local scope = {} + +function scope.lineno (s, i) + if i == 1 then return 1, 1 end + local l, lastline = 0, "" + s = s:sub(1, i) .. "\n" + for line in s:gmatch("[^\n]*[\n]") do + l = l + 1 + lastline = line + end + local c = lastline:len() - 1 + return l, c ~= 0 and c or 1 +end + +function scope.new_scope (env) + if not env.scope then + env.scope = 0 + else + env.scope = env.scope + 1 + end + local scope = env.scope + env.maxscope = scope + env[scope] = {} + env[scope]["label"] = {} + env[scope]["local"] = {} + env[scope]["goto"] = {} +end + +function scope.begin_scope (env) + env.scope = env.scope + 1 +end + +function scope.end_scope (env) + env.scope = env.scope - 1 +end + +function scope.new_function (env) + if not env.fscope then + env.fscope = 0 + else + env.fscope = env.fscope + 1 + end + local fscope = env.fscope + env["function"][fscope] = {} +end + +function scope.begin_function (env) + env.fscope = env.fscope + 1 +end + +function scope.end_function (env) + env.fscope = env.fscope - 1 +end + +function scope.begin_loop (env) + if not env.loop then + env.loop = 1 + else + env.loop = env.loop + 1 + end +end + +function scope.end_loop (env) + env.loop = env.loop - 1 +end + +function scope.insideloop (env) + return env.loop and env.loop > 0 +end + +return scope |
