-
Notifications
You must be signed in to change notification settings - Fork 0
/
tabsimbolos.lua
68 lines (55 loc) · 1.39 KB
/
tabsimbolos.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
local erro = require 'erro'
erro = erro.erro
local idxGlobal = 1
local ambiente
local tglobal = {
["leia"] = {},
["escreva"] = {}
}
local function criaAmbiente (g)
ambiente = {}
local g = g or tglobal
table.insert(ambiente, tglobal)
return ambiente
end
local function entraBloco (ambiente)
table.insert(ambiente, {})
end
local function saiBloco (ambiente)
assert(#ambiente > 1) -- ver depois o ambiente global
table.remove(ambiente)
end
local function getAmbienteGlobal ()
return ambiente[idxGlobal]
end
local function insereSimbolo (simbolo, ambiente, params)
local n = #ambiente
local nome = simbolo.v
--print("insere tipo = ", nome)
--print("insere tipo = ", simbolo.tipo, simbolo.tipo.basico, simbolo.tipo.tag)
if ambiente[n][nome] then
erro("o símbolo '" .. nome .. "' jah foi declarado nesse escopo", simbolo.linha)
else
ambiente[n][nome] = { v = nome, tipo = simbolo.tipo, params = params }
end
end
local function procuraSimbolo (simbolo, ambiente)
local n = #ambiente
local nome = simbolo.v
--print("procuraSimbolo", nome, simbolo.v)
while n >= 1 do
if ambiente[n][nome] then
return ambiente[n][nome]
end
n = n - 1
end
erro("o símbolo '" .. nome .. "' nao foi declarado", simbolo.linha)
return nil
end
return {
criaAmbiente = criaAmbiente,
entraBloco = entraBloco,
saiBloco = saiBloco,
insereSimbolo = insereSimbolo,
procuraSimbolo = procuraSimbolo
}