From 11afea5d4d000a8262e340f39199d02015d953b4 Mon Sep 17 00:00:00 2001
From: Lior Dinf <ls12@inf.ufpr.br>
Date: Tue, 16 Jun 2015 14:46:17 -0300
Subject: [PATCH] =?UTF-8?q?Arrumado=20atribui=C3=A7=C3=A3o?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/scala/other/Parser.scala | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/main/scala/other/Parser.scala b/src/main/scala/other/Parser.scala
index 3862e26..e108459 100644
--- a/src/main/scala/other/Parser.scala
+++ b/src/main/scala/other/Parser.scala
@@ -99,7 +99,22 @@ class Arith extends JavaTokenParsers {
     
     def verificaTipoAtrib (idAtrib:String) {
       val e = TabelaSimb.getById(idAtrib).get
-      val tipoExpr = stackbooltipo.pop()
+      val boolDistinct = stackbooltipo.distinct
+      if (boolDistinct.size!=1 && !(boolDistinct.size==2 && boolDistinct.contains("integer")) )
+      {
+        println("Erro de tipagem na expressão da atribuição")
+        sys.exit(1)        
+      }
+      
+      val tipoExpr = boolDistinct.size match {
+        case 1 => boolDistinct.pop()
+        case 2 => boolDistinct.top match {
+                    case "integer" => boolDistinct.pop(); boolDistinct.pop()
+                    case _ => boolDistinct.pop()
+                  }
+      }
+      boolDistinct.clear()
+      
       val tipoAtrib = e match {
         case v:Var    => v.tipo  
         case p:Param  => p.tipo
@@ -175,6 +190,7 @@ class Arith extends JavaTokenParsers {
             if (distinct.size==1 || (distinct.size==2 && distinct.contains("integer")) )
             {
               //fine
+              stackbooltipo.clear()
             }
             else {
                 println("Erro de tipo: dois lados da expressão booleana com tipos diferentes")
-- 
GitLab