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 {
def -- = num-=1
def geraRotulo = {
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,22 +28,39 @@ object Tudo {
TabelaSimb insere vars.map { id =>
val v = Var(id, desloc, nivelLexico); desloc += 1; v
}
MEPA += "AMEM " + orgSize
aplica("AMEM " + orgSize)
} 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 {
case Some(it) => it match {
case v:Var =>
if (MyParser.eh_param) {
val isByRef = MyParser.procStack.top match {
case p:Procedimento => p.paramInfo(MyParser.paramCounter.get).byRef
case f:Funcao => f.paramInfo(MyParser.paramCounter.get).byRef
}
val isByRef = isAtArgByRef()
if (isByRef)
aplica("CREN "+v.nvLex+", "+v.desloc)
else
......@@ -46,32 +69,28 @@ object Tudo {
aplica("CRVL "+v.nvLex+", "+v.desloc)
case p:Param =>
if (MyParser.eh_param) {
val isByRef = MyParser.procStack.top match {
case p:Procedimento => p.paramInfo(MyParser.paramCounter.get).byRef
case f:Funcao => f.paramInfo(MyParser.paramCounter.get).byRef
}
val isByRef = isAtArgByRef()
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
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
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 f:Funcao => aplica("CHPR "+f.rotEntrada+", "+nvLexAtual)
case other =>
println("Erro(1): Identificador Inválido: "+ id)
sys.exit(1)
}
case None =>
if(id!="read" && id!="write") {
println("Erro(2): Identificador Inválido: "+ id);
sys.exit(1)
} else id match {
case "read" => aplica("LEIT")
case "write" => aplica("IMPR")
}
}
}
......@@ -104,7 +123,13 @@ object Tudo {
case Some( lstParams ) if ! lstParams.isEmpty =>
val ps = retornaParamsLst(lstParams, nivelLexico)
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 =>
TabelaSimb.insere( Procedimento(id, List.empty, nivelLexico, rotulo) )
}
......@@ -118,9 +143,15 @@ object Tudo {
val ps = retornaParamsLst(lstParams, nivelLexico)
val desloc = -4-ps.size
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 =>
TabelaSimb.insere( Funcao(id, null, -4, nivelLexico,rotulo) )
TabelaSimb.insere( Funcao(id, List.empty, -4, nivelLexico, rotulo) )
}
}
......@@ -233,8 +264,12 @@ object Tudo {
aplica("CRCT "+num)
}
def aplica(cmdMEPA: String) {
MEPA += cmdMEPA
def aplica(cmdMEPA: String) : Unit =
MEPA += (if ( ! cmdMEPA.contains(":") ) " " else "") + cmdMEPA
def paplica(cmdMEPA: String) = {
println(cmdMEPA)
aplica(cmdMEPA)
}
def gotoRotulo(rot: String, nivelLexico: Int) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment