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