Skip to content
Snippets Groups Projects
Commit da9cdfc9 authored by Lior Spach's avatar Lior Spach
Browse files

Upadate Tudo.scala

parent 4952f562
No related branches found
No related tags found
No related merge requests found
...@@ -11,7 +11,13 @@ object Tudo { ...@@ -11,7 +11,13 @@ object Tudo {
def -- = num-=1 def -- = num-=1
def geraRotulo = { def geraRotulo = {
num += 1 num += 1
"R"+ (if (num<10) "00"+num else if (num<100) "0"+num else num) "R"+ (
num match {
case dig if num<10 => "0"+dig
case dezena if num<100 => ""+dezena
case bigger if num>=100 => "" + bigger
}
)
} }
} }
...@@ -22,56 +28,69 @@ object Tudo { ...@@ -22,56 +28,69 @@ object Tudo {
TabelaSimb insere vars.map { id => TabelaSimb insere vars.map { id =>
val v = Var(id, desloc, nivelLexico); desloc += 1; v val v = Var(id, desloc, nivelLexico); desloc += 1; v
} }
MEPA += "AMEM " + orgSize aplica("AMEM " + orgSize)
} else { } else {
println("Erro: declaração de variáveis: identificadores já declarados: "+vars.diff(vars.distinct).mkString(" ")) println("Erro: declaração de variáveis:")
println(" identificadores já declarados para parametros ou var: "+vars.diff(vars.distinct).mkString(" "))
sys.exit(1)
} }
} }
def chamaId(id: String, nvLexAtual:Int):Unit = { def geraMepaDoId(id: String, nvLexAtual:Int): Unit =
try
geraMepaDoId_code(id,nvLexAtual)
catch {
case e:IndexOutOfBoundsException =>
val id = MyParser.procStack.pop.id
println("Erro: Número de parametros"+
" incorretos na chamada da função/procedimento "+id)
sys.exit(1)
}
def isAtArgByRef() = {
MyParser.procStack.top match {
case p:Procedimento => p.paramInfo(MyParser.paramCounterStack.top).byRef
case f:Funcao => f.paramInfo(MyParser.paramCounterStack.top).byRef
case o => false //write and read will get here
}
}
private def geraMepaDoId_code(id: String, nvLexAtual:Int): Unit = {
TabelaSimb.getById(id) match { TabelaSimb.getById(id) match {
case Some(it) => it match { case Some(it) => it match {
case v:Var => case v:Var =>
if (MyParser.eh_param) { if (MyParser.eh_param) {
val isByRef = MyParser.procStack.top match { val isByRef = isAtArgByRef()
case p:Procedimento => p.paramInfo(MyParser.paramCounter.get).byRef
case f:Funcao => f.paramInfo(MyParser.paramCounter.get).byRef
}
if (isByRef) if (isByRef)
aplica("CREN "+v.nvLex+","+v.desloc) aplica("CREN "+v.nvLex+", "+v.desloc)
else else
aplica("CRVL "+v.nvLex+","+v.desloc) aplica("CRVL "+v.nvLex+", "+v.desloc)
} else } else
aplica("CRVL "+v.nvLex+","+v.desloc) aplica("CRVL "+v.nvLex+", "+v.desloc)
case p:Param => case p:Param =>
if (MyParser.eh_param) { if (MyParser.eh_param) {
val isByRef = MyParser.procStack.top match { val isByRef = isAtArgByRef()
case p:Procedimento => p.paramInfo(MyParser.paramCounter.get).byRef
case f:Funcao => f.paramInfo(MyParser.paramCounter.get).byRef
}
if (isByRef) if (isByRef)
if (p.byRef) aplica("CRVL "+p.nvLex+","+p.desloc) else aplica("CREN "+p.nvLex+","+p.desloc) if (p.byRef) aplica("CRVL "+p.nvLex+", "+p.desloc)
else aplica("CREN "+p.nvLex+", "+p.desloc)
else else
if (p.byRef) aplica("CRVI "+p.nvLex+","+p.desloc) else aplica("CRVL "+p.nvLex+","+p.desloc) if (p.byRef) aplica("CRVI "+p.nvLex+", "+p.desloc)
else aplica("CRVL "+p.nvLex+", "+p.desloc)
} else } else
if (p.byRef) aplica("CRVI "+p.nvLex+","+p.desloc) else aplica("CRVL "+p.nvLex+","+p.desloc) if (p.byRef) aplica("CRVI "+p.nvLex+", "+p.desloc)
else aplica("CRVL "+p.nvLex+", "+p.desloc)
case p:Procedimento => aplica("CHPR "+p.rotEntrada+", "+nvLexAtual)
case p:Procedimento => aplica("CHPR "+p.rotEntrada+","+nvLexAtual) case f:Funcao => aplica("CHPR "+f.rotEntrada+", "+nvLexAtual)
case f:Funcao => aplica("CHPR "+f.rotEntrada+","+nvLexAtual)
case other => case other =>
println("Erro(1): Identificador Inválido: "+ id) println("Erro(1): Identificador Inválido: "+ id)
sys.exit(1) sys.exit(1)
} }
case None => case None =>
if(id!="read" && id!="write") {
println("Erro(2): Identificador Inválido: "+ id); println("Erro(2): Identificador Inválido: "+ id);
sys.exit(1) sys.exit(1)
} else id match {
case "read" => aplica("LEIT")
case "write" => aplica("IMPR")
}
} }
} }
...@@ -104,7 +123,13 @@ object Tudo { ...@@ -104,7 +123,13 @@ object Tudo {
case Some( lstParams ) if ! lstParams.isEmpty => case Some( lstParams ) if ! lstParams.isEmpty =>
val ps = retornaParamsLst(lstParams, nivelLexico) val ps = retornaParamsLst(lstParams, nivelLexico)
TabelaSimb.insere( Procedimento(id, ps, nivelLexico, rotulo) ) TabelaSimb.insere( Procedimento(id, ps, nivelLexico, rotulo) )
ps.foreach { TabelaSimb.insere } ps.foreach { param =>
if (TabelaSimb.temParamOuVarComMesmoId(param.id)) {
println("Erro: Parâmetros com mesmo nome no procedimento "+id+": "+ param.id)
sys.exit(1)
}
TabelaSimb.insere(param)
}
case None => case None =>
TabelaSimb.insere( Procedimento(id, List.empty, nivelLexico, rotulo) ) TabelaSimb.insere( Procedimento(id, List.empty, nivelLexico, rotulo) )
} }
...@@ -118,9 +143,15 @@ object Tudo { ...@@ -118,9 +143,15 @@ object Tudo {
val ps = retornaParamsLst(lstParams, nivelLexico) val ps = retornaParamsLst(lstParams, nivelLexico)
val desloc = -4-ps.size val desloc = -4-ps.size
TabelaSimb.insere( Funcao(id,ps,desloc,nivelLexico,rotulo) ) TabelaSimb.insere( Funcao(id,ps,desloc,nivelLexico,rotulo) )
ps.foreach { TabelaSimb.insere } ps.foreach { param =>
if (TabelaSimb.temParamOuVarComMesmoId(param.id)) {
println("Erro: Parâmetros com mesmo nome na função "+id+": "+ param.id)
sys.exit(1)
}
TabelaSimb.insere(param)
}
case None => case None =>
TabelaSimb.insere( Funcao(id, null, -4, nivelLexico,rotulo) ) TabelaSimb.insere( Funcao(id, List.empty, -4, nivelLexico, rotulo) )
} }
} }
...@@ -172,8 +203,8 @@ object Tudo { ...@@ -172,8 +203,8 @@ object Tudo {
) )
TabelaSimb.top match { TabelaSimb.top match {
case p:Procedimento => aplica("RTPR "+ p.nvLex +","+p.paramInfo.size) case p:Procedimento => aplica("RTPR "+ p.nvLex +", "+p.paramInfo.size)
case f:Funcao => aplica("RTPR "+ f.nvLex+","+f.paramInfo.size ) case f:Funcao => aplica("RTPR "+ f.nvLex+", "+f.paramInfo.size )
case e => println(e); println("Nao eh instancia proc nem func-> ERRO"); sys.exit(2) case e => println(e); println("Nao eh instancia proc nem func-> ERRO"); sys.exit(2)
} }
} }
...@@ -197,7 +228,7 @@ object Tudo { ...@@ -197,7 +228,7 @@ object Tudo {
} else { } else {
r.put = true r.put = true
//r.used = true goto should do that //r.used = true goto should do that
aplica(r.rotulo+": ENRT "+nvLex+","+TabelaSimb.numVarsLocais(nvLex)) aplica(r.rotulo+": ENRT "+nvLex+", "+TabelaSimb.numVarsLocais(nvLex))
} }
case _ => println("Erro: Rótulo "+rotuloLogico+" não declarado!"); sys.exit(1) case _ => println("Erro: Rótulo "+rotuloLogico+" não declarado!"); sys.exit(1)
} }
...@@ -219,10 +250,10 @@ object Tudo { ...@@ -219,10 +250,10 @@ object Tudo {
val e = TabelaSimb.getById(id) val e = TabelaSimb.getById(id)
e match { e match {
case Some(e) => e match { case Some(e) => e match {
case f:Funcao => aplica("ARMZ "+f.nvLex+","+f.desloc) case f:Funcao => aplica("ARMZ "+f.nvLex+", "+f.desloc)
case v:Var => aplica("ARMZ "+v.nvLex+","+v.desloc) case v:Var => aplica("ARMZ "+v.nvLex+", "+v.desloc)
case p:Param => case p:Param =>
if (p.byRef) aplica("ARMI "+p.nvLex+","+p.desloc) else aplica("ARMZ "+p.nvLex+","+p.desloc) if (p.byRef) aplica("ARMI "+p.nvLex+", "+p.desloc) else aplica("ARMZ "+p.nvLex+", "+p.desloc)
case other => println("Atribuição a "+id+" é inválida!"); sys.exit(1) case other => println("Atribuição a "+id+" é inválida!"); sys.exit(1)
} }
case None => println("identificador inválido: "+id); sys.exit(1) case None => println("identificador inválido: "+id); sys.exit(1)
...@@ -233,17 +264,21 @@ object Tudo { ...@@ -233,17 +264,21 @@ object Tudo {
aplica("CRCT "+num) aplica("CRCT "+num)
} }
def aplica(cmdMEPA: String) { def aplica(cmdMEPA: String) : Unit =
MEPA += cmdMEPA MEPA += (if ( ! cmdMEPA.contains(":") ) " " else "") + cmdMEPA
}
def paplica(cmdMEPA: String) = {
println(cmdMEPA)
aplica(cmdMEPA)
}
def gotoRotulo(rot: String, nivelLexico: Int) { def gotoRotulo(rot: String, nivelLexico: Int) {
val r = TabelaSimb.getById(rot) val r = TabelaSimb.getById(rot)
r match { r match {
case Some(s) => s match { case Some(s) => s match {
case r:Label => case r:Label =>
r.used = true r.used = true
aplica("DSVR "+r.rotulo+","+r.nvLex+","+nivelLexico) aplica("DSVR "+r.rotulo+", "+r.nvLex+", "+nivelLexico)
case _ => println("goto para rótulo não declarado! (goto "+rot+")"); sys.exit(1) case _ => println("goto para rótulo não declarado! (goto "+rot+")"); sys.exit(1)
} }
case None => println("goto para rótulo não declarado! (goto "+rot+")"); sys.exit(1) case None => println("goto para rótulo não declarado! (goto "+rot+")"); sys.exit(1)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment