Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/sqmedeiros/portugol
Browse files Browse the repository at this point in the history
  • Loading branch information
sqmedeiros committed Jul 4, 2016
2 parents 78c89db + e38d8f1 commit f08fa90
Show file tree
Hide file tree
Showing 13 changed files with 209 additions and 37 deletions.
6 changes: 0 additions & 6 deletions arvore.lua
Original file line number Diff line number Diff line change
Expand Up @@ -302,12 +302,6 @@ local function noDecVar (v, e)
v = v.v, exp = e, linha = v.linha }
end

--local function noDecArrayVar (v, e1, e2)
--print("ArrayVar123", e1, e2, v.v, v.tipo, v.tipo.tag, v.tipo.basico)
-- return { tag = Tag.decArrayVar, --tipo = makeTipo(TipoTag.array, TipoBasico.naotipado),
-- v = v.v, tam = e1, exp = e2, linha = v.linha }
--end

local function ehExpressao (e)
return e.ehExp
end
Expand Down
36 changes: 20 additions & 16 deletions interpretador.lua
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ local function avalia (exp, ambiente)
if exp.p1 and exp.p2 then
local v1 = avalia(exp.p1, ambiente)
local v2 = avalia(exp.p2, ambiente)
if v1 == nil or v2 == nil then
error("(Erro)Perto da linha " .. exp.linha .. ": operação inválida com expressão sem valor")
end
local op = exp.op.op
if op == "opSoma" then
if type(v1) == "string" then
Expand Down Expand Up @@ -77,7 +80,7 @@ local function avalia (exp, ambiente)
elseif exp.tag == Tag.expArrayVar then
local var = tab.getValor(exp, ambiente)
--print("expArrayVar", var, var.v, var.tipo, var.tipo.tag, var.tipo.dim)
local res = getVarArrayRef(var, 1, exp.t, ambiente)
local res = getVarArrayRef(var, 1, exp.t, ambiente, var.linha)
--print("arrayVar2 res = ", res, res.v)
return res.v --TODO: ver o caso de "res" ser um array
elseif exp.tag == Tag.expChamada then
Expand Down Expand Up @@ -111,18 +114,19 @@ function avaliaExpChamada (exp, ambiente)
elseif exp.nome.v == "leia" then
for i, v in ipairs(exp.args) do
local x
repeat
--print("vartipo", v.tipo, v.v, v.tag)
if v.tipo.basico == TipoBasico.inteiro or v.tipo.basico == TipoBasico.numero then
x = io.read("*n")
x = tonumber(x)
else
x = io.read()
end
until true == true --x ~= nil
--print("vartipo", v.tipo, v.v, v.tag)
if v.tipo.basico == TipoBasico.inteiro or v.tipo.basico == TipoBasico.numero then
x = io.read("*n")
x = tonumber(x)
else
x = io.read("l")
end
if not x then
error("(Erro) Perto da linha " .. exp.nome.linha .. ": erro ao ler '" .. v.v .. "'")
end
local ref = tab.getValor(v, ambiente)
if v.tipo.tag == TipoTag.array then
ref = getVarArrayRef(ref, 1, v.t, ambiente)
ref = getVarArrayRef(ref, 1, v.t, ambiente, v.linha)
end
tab.setValor(ref, x)
end
Expand Down Expand Up @@ -152,7 +156,7 @@ function avaliaExpChamada (exp, ambiente)
end
end

function getVarArrayRef (v, i, t, ambiente)
function getVarArrayRef (v, i, t, ambiente, linha)
--print("arrayRef", v, i, t)
if t == nil then
return v
Expand All @@ -163,16 +167,16 @@ function getVarArrayRef (v, i, t, ambiente)
--print("ref2 ", v.array[x])

if v.n == nil then
error("Erro: array não inicializado")
error("(Erro) Perto da linha " .. linha .. " array não inicializado")
elseif x > v.n then
error("Erro: acesso a índice inválido " .. x .. " do array")
error("(Erro) Perto da linha " .. linha .. " acesso a índice inválido " .. x .. " do array")
end

if i == #t then
return v.array[x]
end

return getVarArrayRef(v.array[x], i + 1, t, ambiente)
return getVarArrayRef(v.array[x], i + 1, t, ambiente, linha)
end

local function decArrayVar (v, ambiente)
Expand Down Expand Up @@ -248,7 +252,7 @@ local function execCmdAtrib (c, ambiente)
if var.t ~= nil then
--print("embaixo", var.t, #var.t, var.linha)
end
ref = getVarArrayRef(ref, 1, var.t, ambiente)
ref = getVarArrayRef(ref, 1, var.t, ambiente, var.linha)
--ref.tipo = {}
--ref.tipo.dim = var.tim
--if var.t ~= nil then
Expand Down
3 changes: 2 additions & 1 deletion parser.lua
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ predef["getTipoBasico"] = defs.getTipoBasico

re.setlabels(labelCode)


--TODO: ver o erro quando um expressão é esperada
-- atualmente uma Exp sempre casa, o que não dispara a regra ErroExp
local g = re.compile([[
Programa <- Sp Bloco (!. / ErroIndefinido)
Bloco <- (DecVar / Comando)* -> noBloco
Expand Down
37 changes: 23 additions & 14 deletions semantica.lua
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,27 @@ local analisaExpSimpVar, analisaExpArrayVar, analisaExpNovoArray
local analisaExpOpBin, analisaExpOpNum, analisaExpOpComp, analisaExpOpBool
local analisaExpChamada, analisaListaArg

-- 0 significa um valor basico
-- 1 significa um valor de uma dimensao, etc
local function getVarDecDim (v)
assert(v.tag == Tag.decVar or v.tag == Tag.decArrayVar, v.tag)
return v.tipo.dim
end


-- 0 significa um valor basico
-- 1 significa um valor de uma dimensao, etc
local function getVarDim (v, ambiente)
assert(v.tag == Tag.expSimpVar or v.tag == Tag.expArrayVar)
assert(v.tag == Tag.expSimpVar or v.tag == Tag.expArrayVar or
v.tag == Tag.decVar or v.tag == Tag.decArrayVar, v.tag)

if v.tag == Tag.decVar or v.tag == Tag.decArrayVar then
return getVarDecDim(v)
end

local ref = tabsim.procuraSimbolo(v, ambiente)
if not ref then --nao achou variavel (eh possivel?)
if not ref then --nao achou variavel
assert(false, "Nao achou " .. v.v)
return 0
end
local n = ref.tipo.dim
Expand Down Expand Up @@ -303,25 +318,19 @@ local function analisaAtrib (var, exp, ambiente)
elseif exp.tag == Tag.expNovoArray and var.tipo.tag ~= TipoTag.array then
erro("variável " .. var.v .. " não é um array", exp.linha)
elseif var.tipo.tag == TipoTag.array then
local idx = 0
if var.t then
idx = #var.t
end
local nvar = getVarDim(var, ambiente)
if exp.tag == Tag.expNovoArray then
if exp.dim > var.tipo.dim - idx then
if exp.dim > nvar then
erro("tentativa de atribuir tipo incompatível para a variável '" .. var.v .. "'", var.linha)
end
elseif exp.tipo.tag == TipoTag.array then
local aux = 0
if exp.tipo.t then
aux = #exp.tipo.t
end
if var.tipo.dim - idx ~= exp.tipo.dim - aux then
local nexp = getVarDim(exp, ambiente)
if nvar ~= nexp then
erro("tentativa de atribuir tipo incompatível para a variável '" .. var.v .. "'", var.linha)
elseif var.tipo.dim -idx > 0 and var.tipo.basico ~= exp.tipo.basico then
elseif nvar > 0 and var.tipo.basico ~= exp.tipo.basico then
erro("tentativa de atribuir tipo incompatível para a variável '" .. var.v .. "'", var.linha)
end
elseif var.tipo.dim - idx > 0 then
elseif nvar > 0 then
erro("tentativa de atribuir tipo incompatível para a variável '" .. var.v .. "'", var.linha)
end
end
Expand Down
1 change: 1 addition & 0 deletions test/semYes/textoContaLetra.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
bola de gude!
13 changes: 13 additions & 0 deletions test/semYes/textoContaLetra.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
local linha = io.read("l")

local i = 1
local letra = 0
while i <= #linha do
local aux = string.sub(linha, i, i)
if aux >= "a" and aux <= "z" then
letra = letra + 1
end
i = i + 1
end

print("Letras = ", letra)
22 changes: 22 additions & 0 deletions test/semYes/textoContaLetra.por
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
texto linha
/*inteiro[] letra = novo inteiro[26]
inteiro i = 1
repita enquanto i <= 26
letra[i] = 0
i = i + 1
fim*/

entrada(linha)

inteiro i = 1
inteiro letra = 0
repita enquanto i <= textoComp(linha)
texto aux = textoPos(linha, i)
se aux >= "a" e aux <= "z"
letra = letra + 1
fim
i = i + 1
fim

saida("Letras = ", letra)
2 changes: 2 additions & 0 deletions test/semYes/textoEmbaralha.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
casa
loteria
26 changes: 26 additions & 0 deletions test/semYes/textoEmbaralha.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
local s1, s2

print("Digite uma palava: ")
s1 = io.read("l")
print("Digite outra palavra: ")
s2 = io.read("l")

local s3 = ""

local i = 1
while i <= #s1 and i <= #s2 do
s3 = s3 .. string.sub(s1, i, i) .. string.sub(s2, i, i)
i = i + 1
end

while i <= #s1 do
s3 = s3 .. strinng.sub(s1, i, i)
i = i + 1
end

while i <= #s2 do
s3 = s3 .. string.sub(s2, i, i)
i = i + 1
end

print(s1, s2, s3)
26 changes: 26 additions & 0 deletions test/semYes/textoEmbaralha.por
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
texto s1, s2

saida("Digite uma palava: ")
entrada(s1)
saida("Digite outra palavra: ")
entrada(s2)

texto s3 = ""

inteiro i = 1
repita enquanto i <= textoComp(s1) e i <= textoComp(s2)
s3 = s3 + textoPos(s1, i) + textoPos(s2, i)
i = i + 1
fim

repita enquanto i <= textoComp(s1)
s3 = s3 + textoPos(s1, i)
i = i + 1
fim

repita enquanto i <= textoComp(s2)
s3 = s3 + textoPos(s2, i)
i = i + 1
fim

saida(s1, s2, s3)
7 changes: 7 additions & 0 deletions test/semYes/textoOrdena.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
6
bola
casa
ontem
amanha
hoje
onibus
33 changes: 33 additions & 0 deletions test/semYes/textoOrdena.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
local palavra
local n

n = io.read("n")
local aux = io.read("l")

local palavra = {}
local i = 1
while i <= n do
palavra[i] = io.read("l")
i = i + 1
end

i = 2
while i <= n do
local j = i - 1
while j >= 1 do
if palavra[j] > palavra[j+1] then
local aux = palavra[j+1]
palavra[j+1] = palavra[j]
palavra[j] = aux
end
j = j - 1
end
i = i + 1
end

i = 1
while i <= n do
print(palavra[i])
i = i + 1
end

34 changes: 34 additions & 0 deletions test/semYes/textoOrdena.por
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
texto[] palavra
inteiro n

entrada(n)
texto aux
entrada(aux)

palavra = novo texto[n]
inteiro i = 1
repita enquanto i <= n
entrada(palavra[i])
i = i + 1
fim

i = 2
repita enquanto i <= n
inteiro j = i - 1
repita enquanto j >= 1
se palavra[j] > palavra[j+1]
texto aux = palavra[j+1]
palavra[j+1] = palavra[j]
palavra[j] = aux
fim
j = j - 1
fim
i = i + 1
fim

i = 1
repita enquanto i <= n
saida(palavra[i])
i = i + 1
fim

0 comments on commit f08fa90

Please sign in to comment.