aboutsummaryrefslogtreecommitdiff
path: root/src/scope.lua
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2016-07-01 22:08:45 -0400
committerAlexander Pickering <alexandermpickering@gmail.com>2016-07-01 22:08:45 -0400
commit774b296d3e49b8be3b0feaee8b5d3154fcec73b6 (patch)
treee076254b6332c177dc34b4d87bc222f52ca49646 /src/scope.lua
downloadglum-774b296d3e49b8be3b0feaee8b5d3154fcec73b6.tar.gz
glum-774b296d3e49b8be3b0feaee8b5d3154fcec73b6.tar.bz2
glum-774b296d3e49b8be3b0feaee8b5d3154fcec73b6.zip
Initial commit
Diffstat (limited to 'src/scope.lua')
-rw-r--r--src/scope.lua74
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