From a1a9aeb798be7abcdf0e9d4902ac6d1c3c705121 Mon Sep 17 00:00:00 2001
From: ls12 5o Andar <ls12@inf.ufpr.br>
Date: Tue, 5 May 2015 13:26:56 -0300
Subject: [PATCH] Reconhece ; e retorna lista de tokens

---
 compiler/Lexer.scala | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/compiler/Lexer.scala b/compiler/Lexer.scala
index 9584721..6491a3b 100755
--- a/compiler/Lexer.scala
+++ b/compiler/Lexer.scala
@@ -7,12 +7,14 @@ case class Token(val value:String, val func:String)
 val palavrasReservadas = List("begin", "end", "function", "procedure", "var", "program")
 val letras = List.concat('a' to 'z','A' to 'Z',"_")
 val numeros = ('0' to '9').toList
+val separadores = List(' ','\t','\n',';')
 
 //Funcoes booleanas
 val num          = (c:Char) => numeros.contains(c)
 val op           = (c:Char) => "+-*/=:".contains(c)
 val letra        = (c:Char) => letras.contains(c)
 val espacoLinTab = (c:Char) => c==' ' || c=='\t' || c=='\n'
+val separador     = (c:Char) => separadores.contains(c)
 val palavraReservada = (s:String) => palavrasReservadas.contains(s)
 
 //Verificadores
@@ -25,42 +27,47 @@ val erro = (msg:String) => {println("Erro: "+msg); sys.exit(1)}
 
 def take(iter:BufferedIterator[Char]) = {
   var acc=""
-  while (iter.hasNext && ! espacoLinTab(iter.head) && ! op(iter.head))
+  while (iter.hasNext && ! separador(iter.head) && ! op(iter.head))
     acc += iter.next
   acc
 }
 
-def atomo(str:String) {
+def atomo(str:String):List[Token] = {
+  var tokenList = List[Token]()
   val iter = str.iterator.buffered
   while (iter.hasNext) {
     val c = iter.next
-    println( c match {
-
+    tokenList = (c match {
       case c if num(c) => //NUMERO
         val acc = c + take(iter)
         verificaNumero(acc)
-        (acc,"numero")
+        Token(acc,"numero")
 
       case c if op(c) => //OPERADOR
         if ((c==':') && (iter.head == '='))
-          (c+""+iter.next, "op")
+          Token(c+""+iter.next, "op")
         else
-          (c, "op")
+          Token(c+"", "op")
 
       case c if letra(c) => //IDENTIFICADOR
         val acc = c + take(iter)
         verificaIdentificador(acc)
         if (palavraReservada(acc))
-          (acc,"reservado")
+          Token(acc,"reservado")
         else
-          (acc, "identificador")
+          Token(acc, "identificador")
       
       case c if espacoLinTab(c) => /*pula*/
         iter.dropWhile(espacoLinTab)
-        ""
+        null;// continue
+      case c if c == ';' =>
+        Token(";", "pontoevirgula")
       case erroCh => erro(erroCh+"")//TODO:which line error occurred?
-    })
+    }) :: tokenList
   }
+  tokenList = tokenList.filterNot(_==null).reverse
+  println(tokenList)
+  tokenList
 }
 
 
-- 
GitLab