Beispiel #1
0
 def autoDelimitador(self, y, linha, elementos, linhaAtual):
     self.lexema += linha[y]
     elemento = Elemento("delimitador", self.lexema, linhaAtual)
     elementos.append(elemento)
     self.lexema = ''
     y += 1
     return y
Beispiel #2
0
    def autoCadCaracteres(self, y, linha, elementos, linhaAtual, totalLinhas,
                          erros):
        self.lexema += linha[y]
        if (y < len(linha)):
            y += 1
        while y < len(linha) and (linha[y] in self.alfabeto
                                  or linha[y] == "\""):
            self.lexema += linha[y]
            if (linha[y] == "\""):
                self.estado_erro = False
                y += 1
                break
            if (y < len(linha)):
                y += 1

        if (self.estado_erro):
            erro = Erro("Cadeia de caractere mal formada", self.lexema,
                        linhaAtual)
            erros.append(erro)
        else:
            elemento = Elemento("Cadeia de caractere", self.lexema, linhaAtual)
            elementos.append(elemento)

        self.lexema = ''
        self.estado_erro = True
        return y
Beispiel #3
0
    def autoDigito(self, y, linha, elementos, linhaAtual, totalLinhas, erros):
        self.estado_erro = False
        self.lexema += linha[y]
        if (y < len(linha)):
            y += 1
        while y < len(linha) and (linha[y] in self.digitos):
            self.estado_erro = False
            self.lexema += linha[y]
            if (y < len(linha)):
                y += 1
        if y < len(linha) and linha[y] == '.':
            self.lexema += linha[y]
            self.estado_erro = True
            if (y < len(linha)):
                y += 1
            while y < len(linha) and (linha[y] in self.digitos):
                self.estado_erro = False
                self.lexema += linha[y]
                if (y < len(linha)):
                    y += 1

        if (self.estado_erro):
            erro = Erro("Numero mal formado", self.lexema, linhaAtual)
            erros.append(erro)
        else:
            elemento = Elemento("Numero", self.lexema, linhaAtual)
            elementos.append(elemento)

        self.lexema = ''
        self.estado_erro = True
        return y
Beispiel #4
0
 def autoIdentificador(self, y, linha, elementos, linhaAtual, totalLinhas,
                       erros):
     self.lexema += linha[y]
     if (y < len(linha)):
         y += 1
     while y < len(linha) and (linha[y] in self.letras or linha[y]
                               in self.digitos or linha[y] == '_'):
         self.lexema += linha[y]
         if (y < len(linha)):
             y += 1
     if (self.lexema in self.palavras_reservadas):
         elemento = Elemento("palavra_reservada", self.lexema, linhaAtual)
     else:
         elemento = Elemento("identificador", self.lexema, linhaAtual)
     elementos.append(elemento)
     self.lexema = ''
     return y
Beispiel #5
0
    def autoOpAritmetico(self, y, linha, elementos, linhaAtual, totalLinhas,
                         erros):
        self.lexema += linha[y]
        if linha[y] == '+':
            y += 1
            if y != len(linha) and linha[y] == '+':
                self.lexema += linha[y]
                elemento = Elemento("op aritmetico", self.lexema, linhaAtual)
                elementos.append(elemento)
                self.lexema = ''
                y += 1
                xy = [0, y]
                return xy
            else:
                elemento = Elemento("op aritmetico", self.lexema, linhaAtual)
                elementos.append(elemento)
                self.lexema = ''
                xy = [0, y]
                return xy
        elif linha[y] == '-':
            y += 1
            if (y < len(linha)
                    and (linha[y] == ' ' or linha[y] in self.digitos)):
                while y < len(linha) and (linha[y] == ' '
                                          or linha[y] in self.digitos):
                    if y < len(linha) and (linha[y] in self.digitos):
                        y = self.autoDigito(y, linha, elementos, linhaAtual,
                                            totalLinhas, erros)
                        xy = [0, y]
                        return xy
                    self.lexema += linha[y]
                    y += 1

            if y < len(linha) and linha[y] == '-':
                self.lexema += linha[y]
                elemento = Elemento("op aritmetico", self.lexema, linhaAtual)
                elementos.append(elemento)
                self.lexema = ''
                y += 1
                xy = [0, y]
                return xy
            else:
                elemento = Elemento("op aritmetico", self.lexema, linhaAtual)
                elementos.append(elemento)
                self.lexema = ''
                xy = [0, y]
                return xy
        elif linha[y] == '*':
            elemento = Elemento("op aritmetico", self.lexema, linhaAtual)
            elementos.append(elemento)
            self.lexema = ''
            y += 1
            xy = [0, y]
            return xy
        ##Caso seja '/'
        elif linha[y] == '/':
            y += 1
            ##Caso seja '//' ou '/*'
            if y != len(linha):
                if linha[y] == '/' or linha[y] == '*':
                    xy = self.autoComentario(y, linha, elementos, linhaAtual,
                                             totalLinhas, erros)
                    return xy
                else:
                    elemento = Elemento("op aritmetico", self.lexema,
                                        linhaAtual)
                    elementos.append(elemento)
                    self.lexema = ''
                    xy = [0, y]
                    return xy
            else:
                elemento = Elemento("op aritmetico", self.lexema, linhaAtual)
                elementos.append(elemento)
                self.lexema = ''
                xy = [0, y]
                return xy
Beispiel #6
0
 def autoOpRelacionaisLogicos(self, y, linha, elementos, linhaAtual, erros):
     self.lexema += linha[y]
     if linha[y] == '<' or linha[y] == '>' or linha[y] == '=':
         if (y + 1 < len(linha)):
             y += 1
             if linha[y] == '=':
                 self.lexema += linha[y]
                 elemento = Elemento("op relacional", self.lexema,
                                     linhaAtual)
                 elementos.append(elemento)
                 self.lexema = ''
                 y += 1
             else:
                 elemento = Elemento("op relacional", self.lexema,
                                     linhaAtual)
                 elementos.append(elemento)
                 self.lexema = ''
             return y
         # self.lexema :  < ou > ou =
         else:
             elemento = Elemento("op relacional", self.lexema, linhaAtual)
             elementos.append(elemento)
             self.lexema = ''
         return y + 1
     elif linha[y] == '!':
         if (y + 1 < len(linha)):
             y += 1
             if linha[y] == '=':
                 self.lexema += linha[y]
                 elemento = Elemento("op relacional", self.lexema,
                                     linhaAtual)
                 elementos.append(elemento)
                 self.lexema = ''
                 y += 1
             else:
                 elemento = Elemento("op logico", self.lexema, linhaAtual)
                 elementos.append(elemento)
                 self.lexema = ''
             return y
         else:
             elemento = Elemento("op logico", self.lexema, linhaAtual)
             elementos.append(elemento)
             self.lexema = ''
             return y + 1
     elif linha[y] == '&':
         if (y + 1 < len(linha)):
             y += 1
             if linha[y] == '&':
                 self.lexema += linha[y]
                 elemento = Elemento("op logico", self.lexema, linhaAtual)
                 elementos.append(elemento)
                 self.lexema = ''
                 y += 1
             else:
                 erro = Erro("Operador logico mal formado", self.lexema,
                             linhaAtual)
                 erros.append(erro)
                 self.lexema = ''
         else:
             erro = Erro("Operador logico mal formado", self.lexema,
                         linhaAtual)
             erros.append(erro)
             self.lexema = ''
             y += 1
         return y
     elif linha[y] == '|':
         if (y + 1 < len(linha)):
             y += 1
             if linha[y] == '|':
                 self.lexema += linha[y]
                 elemento = Elemento("op logico", self.lexema, linhaAtual)
                 elementos.append(elemento)
                 self.lexema = ''
                 y += 1
             else:
                 erro = Erro("Operador logico mal formado", self.lexema,
                             linhaAtual)
                 erros.append(erro)
                 self.lexema = ''
         else:
             erro = Erro("Operador logico mal formado", self.lexema,
                         linhaAtual)
             erros.append(erro)
             self.lexema = ''
             y += 1
         return y
Beispiel #7
0
    def autoComentario(self, y, linha, elementos, linhaAtual, totalLinhas,
                       erros):
        ## Marcador :   //
        self.lexema += linha[y]
        if linha[y] == '/':
            elemento = Elemento("marcador de comentario", self.lexema,
                                linhaAtual)
            elementos.append(elemento)
            self.lexema = ''
            y = len(linha)
            xy = [0, y]
            return xy

        ## Marcador :   /*
        elif linha[y] == '*':
            y += 1
            elemento = Elemento("marcador de comentario", self.lexema,
                                linhaAtual)
            elementos.append(elemento)
            self.lexema = ''
            ## Procura se o */ está no restante da linha atual
            while y < len(linha):
                if linha[y] == '*':
                    self.lexema = linha[y]
                    y += 1
                    if y != len(linha):
                        ## Marcador :   */
                        if linha[y] == '/':
                            self.lexema += linha[y]
                            elemento = Elemento(
                                "marcador de bloco de comentario", self.lexema,
                                linhaAtual)
                            elementos.append(elemento)
                            self.lexema = ''
                            y += 1
                            xy = [0, y]
                            return xy
                else:
                    y += 1
            ## Procura se o */ está no restante das linhas
            linhasPuladas = 0

            arquivoAux2 = open('input/teste.txt', 'r')
            linha_inicio = linhaAtual
            for x in range(0, linhaAtual):
                linha = arquivoAux2.readline()

            while linhaAtual < totalLinhas:
                linha = arquivoAux2.readline()
                linhasPuladas += 1
                linhaAtual += 1
                y = 0

                while y < len(linha):
                    if linha[y] == '*':
                        self.lexema = linha[y]
                        y += 1
                        if y != len(linha) and linha[y] == '/':
                            self.lexema += linha[y]
                            elemento = Elemento("marcador de comentario",
                                                self.lexema, linhaAtual)
                            elementos.append(elemento)
                            self.lexema = ''
                            linhaAtual += 1
                            y += 1
                            xy = [linhasPuladas, y]
                            return xy
                    else:
                        y += 1

            if linhaAtual == totalLinhas:
                erro = Erro('Bloco de comentário não finalizado', self.lexema,
                            linha_inicio)
                erros.append(erro)
                return [linhasPuladas, y + 1]