-
Notifications
You must be signed in to change notification settings - Fork 0
/
tipo.lua
79 lines (62 loc) · 1.68 KB
/
tipo.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
68
69
70
71
72
73
74
75
76
77
78
79
local defs = require 'defs'
local tabsim = require 'tabsimbolos'
local arvore = require 'arvore'
local erro = require 'erro'
local TipoBasico = defs.TipoBasico
local TipoTag = defs.TipoTag
local Tag = defs.Tag
local tiposCompativies
local tabConversao = {}
tabConversao[TipoBasico.bool] = {
[TipoBasico.bool] = true,
[TipoBasico.inteiro] = false,
[TipoBasico.numero] = false,
[TipoBasico.texto] = false,
}
tabConversao[TipoBasico.inteiro] = {
[TipoBasico.bool] = false,
[TipoBasico.inteiro] = true,
[TipoBasico.numero] = true,
[TipoBasico.texto] = true,
}
tabConversao[TipoBasico.numero] = {
[TipoBasico.bool] = false,
[TipoBasico.inteiro] = true,
[TipoBasico.numero] = true,
[TipoBasico.texto] = true,
}
tabConversao[TipoBasico.texto] = {
[TipoBasico.bool] = false,
[TipoBasico.inteiro] = true,
[TipoBasico.numero] = true,
[TipoBasico.texto] = true,
}
local function temTipo (t)
assert(t.tag ~= TipoTag.naotipado and t.basico ~= TipoBasico.naotipado)
end
-- Posso usar o tipo t2 no lugar de t1?
function tiposCompativeis (t1, t2, atrib) -- t1 e t2 são tipos básicos
if t1 == t2 then
return true
end
-- conversão implícita somente de "inteiro" para "numero"
if t1 == TipoBasico.numero and t2 == TipoBasico.inteiro then
return true
end
-- nao pode atribuir um valor "numero" a um valor "inteiro"
if not atrib and t1 == TipoBasico.inteiro and t2 == TipoBasico.numero then
return true
end
return false
end
local function converteTipos (t1, t2)
return tabConversao[t1][t2]
end
local function naoTipado (t)
return t.tag == TipoTag.naotipado or
t.basico == TipoBasico.naotipado
end
return {
naoTipado = naoTipado,
tiposCompativeis = tiposCompativeis
}