def proxToken(self): estado = 1 lexema = "" c = '\u0000' while (True): self.lookahead = self.input_file.read(1) c = self.lookahead.decode('ascii') if (estado == 1): #--------------Q0 if (c == ''): return Token(Tag.EOF, "EOF", self.n_line, self.n_column) elif (c == ' ' or c == '\t' or c == '\n' or c == '\r'): estado = 1 if (c == '\n'): self.n_line += 1 self.n_column = 1 elif (c == ' ' or '\r'): self.n_column += 1 elif (c == '\t'): self.n_column += 3 elif (c == '#'): #--------------Q24 estado = 24 self.n_column += 1 elif (c == '"'): #--------------Q21 estado = 21 self.n_column += 1 elif (c == '='): #--------------Q1 estado = 2 self.n_column += 1 elif (c == '!'): #--------------Q3 estado = 4 self.n_column += 1 elif (c == '<'): #--------------Q6 estado = 6 self.n_column += 1 elif (c == '>'): #--------------Q9 estado = 9 self.n_column += 1 elif (c.isdigit()): #--------------Q16 lexema += c estado = 16 self.n_column += 1 elif (c.isalpha()): #--------------Q26 lexema += c estado = 26 self.n_column += 1 elif (c == '/'): #--------------Q15 self.n_column += 1 token = Token(Tag.OP_DIV, "/", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == '.'): #--------------Q30 self.n_column += 1 token = Token(Tag.SIMB_PONTO, ".", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == ']'): #--------------Q36 self.n_column += 1 token = Token(Tag.SIMB_FECHA_COLCHETES, "]", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == '['): #--------------Q35 self.n_column += 1 token = Token(Tag.SIMB_ABRE_COLCHETES, "[", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == ','): #--------------Q33 self.n_column += 1 token = Token(Tag.SIMB_VIRGULA, ",", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == ')'): #--------------Q34 self.n_column += 1 token = Token(Tag.SIMB_FECHA_PARENTESES, ")", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == '('): #--------------Q32 self.n_column += 1 token = Token(Tag.SIMB_ABRE_PARENTESES, "(", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == ';'): #--------------Q31 self.n_column += 1 token = Token(Tag.SIMB_PONTO_VIRGULA, ";", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == ':'): #--------------Q29 self.n_column += 1 token = Token(Tag.SIMB_DOIS_PONTOS, ":", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == '*'): #--------------Q14 self.n_column += 1 token = Token(Tag.OP_MULT, "*", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == '+'): #--------------Q13 self.n_column += 1 token = Token(Tag.OP_SOMA, "+", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (c == '-'): #--------------Q12 self.n_column += 1 token = Token(Tag.OP_UNARIO, "-", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token else: self.sinalizaErroLexico("Caractere invalido [" + c + "] na linha " + str(self.n_line) + " e coluna " + str(self.n_column)) return None elif (estado == 2): if (c == '='): #--------------Q2 self.n_column += 1 token = Token(Tag.OP_IGUAL, "==", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token else: #--------------Q28 self.retornaPonteiro() token = Token(Tag.OP_ATRIBUI, "=", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (estado == 4): if (c == '='): #--------------Q5 self.n_column += 1 token = Token(Tag.OP_DIFERENTE, "!=", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token else: #--------------Q4 self.retornaPonteiro() token = Token(Tag.OP_UNARIO, "!", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (estado == 6): if (c == '='): #--------------Q7 self.n_column += 1 token = Token(Tag.OP_MENOR_IGUAL, "<=", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token else: #--------------Q8 self.retornaPonteiro() token = Token(Tag.OP_MENOR, "<", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (estado == 9): if (c == '='): #--------------Q10 self.n_column += 1 token = Token(Tag.OP_MAIOR_IGUAL, ">=", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token else: #--------------Q11 self.retornaPonteiro() token = Token(Tag.OP_MAIOR, ">", self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (estado == 16): if (c.isdigit()): #--------------Q16 lexema += c self.n_column += 1 elif (c == '.'): #--------------Q18 lexema += c estado = 18 self.n_column += 1 elif (c == '-'): #RECONHECER INT self.n_column += 1 token = Token(Tag.CONST_INT, lexema, self.n_line, self.n_column) self.ts.addToken(lexema, token) return token #RECONHECER OPERADOR MENOS # token = Token(Tag.OP_SUBTRAI, lexema, self.n_line, self.n_column) #self.ts.addToken(lexema, token) #return token else: #--------------Q17 self.retornaPonteiro() token = Token(Tag.CONST_INT, lexema, self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (estado == 18): #---RECONHECER DOUBLE if (c.isdigit()): #--------------Q19 lexema += c self.n_column += 1 elif (c == '-'): #RECONHECER DOUBLE token = Token(Tag.CONST_DOUBLE, lexema, self.n_line, self.n_column) self.ts.addToken(lexema, token) return token #RECONHECER OPERADOR MENOS #token = Token(Tag.OP_SUBTRAI, lexema, self.n_line, self.n_column) #self.ts.addToken(lexema, token) #return token else: #--------------Q20 self.retornaPonteiro() token = Token(Tag.CONST_DOUBLE, lexema, self.n_line, self.n_column) self.ts.addToken(lexema, token) return token elif (estado == 21): if (c == '"'): #--------------Q23 self.n_column += 1 return Token(Tag.CONST_STRING, lexema, self.n_line, self.n_column) elif (c == '\n'): self.sinalizaErroLexico( "Só é permitido String de uma Linha! Erro na linha " + str(self.n_line) + " e coluna " + str(self.n_column)) self.n_column = 1 self.n_line += 1 else: #--------------Q22 lexema += c self.n_column += 1 elif (estado == 24): if (c == '\n'): #--------------Q0 self.n_line = self.n_line + 1 self.n_column = 1 else: #--------------Q25 estado = 24 elif (estado == 26): if (c.isalnum()): #--------------Q26 lexema += c self.n_column += 1 else: #--------------Q27 self.retornaPonteiro() token = self.ts.getToken(lexema) if (token is None): #--------------VERIFICA TABELA token = Token(Tag.ID, lexema, self.n_line, self.n_column) self.ts.addToken(lexema, token) else: token.setLinha(self.n_line) token.setColuna(self.n_column) return token
def proxToken(self): estado = 1 lexema = "" c = '\u0000' while True: self.lookahead = self.input_file.read(1) c = self.lookahead.decode('ascii') # caractere lido self.n_column = self.n_column + 1 if estado == 1: if c == '': return Token(Tag.EOF, "EOF", self.n_line, self.n_column) elif c == ' ' or c == '\t' or c == '\n' or c == '\r': estado = 1 if c == '\n': self.n_line = self.n_line + 1 self.n_column = 0 elif c == '=': estado = 2 elif c == '!': estado = 4 elif c == '<': estado = 6 elif c == '>': estado = 9 elif c.isdigit(): # Verificando se é um número lexema += c estado = 12 elif c.isalpha(): # Verificando se é uma letra lexema += c estado = 14 elif c == '/': estado = 16 elif c == '+': return Token(Tag.OP_AD, "+", self.n_line, self.n_column) elif c == '*': return Token(Tag.OP_MUL, "*", self.n_line, self.n_column) elif c == '-': return Token(Tag.OP_MIN, "-", self.n_line, self.n_column) elif c == '{': return Token(Tag.SMB_OBC, "{", self.n_line, self.n_column) elif c == '}': return Token(Tag.SMB_CBC, "}", self.n_line, self.n_column) elif c == ';': return Token(Tag.SMB_SEM, ";", self.n_line, self.n_column) elif c == ',': return Token(Tag.SMB_COM, ",", self.n_line, self.n_column) elif c == '(': return Token(Tag.SMB_OPA, "(", self.n_line, self.n_column) elif c == ')': return Token(Tag.SMB_CPA, ")", self.n_line, self.n_column) elif c == '"': estado = 21 else: lexema += c self.sinalizaErroLexico("Caractere invalido [" + c + "] na linha " + str(self.n_line) + " e coluna " + str(self.n_column)) if self.totalErros == 3: return None else: return '' elif estado == 2: if c == '=': return Token(Tag.OP_EQ, "==", self.n_line, self.n_column) else: self.retornaPonteiro() return Token(Tag.OP_ATRIB, "=", self.n_line, self.n_column) elif estado == 4: if c == '=': return Token(Tag.OP_NE, "!=", self.n_line, self.n_column) self.sinalizaErroLexico("Caractere invalido [" + c + "] na linha " + str(self.n_line) + " e coluna " + str(self.n_column)) self.retornaPonteiro() if self.totalErros == 3: return None else: return '' elif estado == 6: if c == '=': return Token(Tag.OP_LE, "<=", self.n_line, self.n_column) self.retornaPonteiro() return Token(Tag.OP_LT, "<", self.n_line, self.n_column) elif estado == 9: if c == '=': return Token(Tag.OP_GE, ">=", self.n_line, self.n_column) self.retornaPonteiro() return Token(Tag.OP_GT, ">", self.n_line, self.n_column) elif estado == 12: if c.isdigit(): lexema += c elif c == '.': lexema += c estado = 20 else: self.retornaPonteiro() return Token(Tag.NUM, lexema, self.n_line, self.n_column) elif estado == 14: if c.isalnum(): # Verificando se é um número ou uma letra lexema += c else: self.retornaPonteiro() token = self.ts.getToken(lexema) if token is None: token = Token(Tag.ID, lexema, 0, 0) self.ts.addToken(lexema, token) token.setColuna(self.n_column) token.setLinha(self.n_line) return token elif estado == 16: if c == '/': estado = 17 elif c == '*': estado = 18 else: self.retornaPonteiro() return Token(Tag.OP_DIV, '/', self.n_line, self.n_column) elif estado == 17: if c == '\n': self.n_line = self.n_line + 1 self.n_column = 0 estado = 1 elif c == '': return Token(Tag.EOF, "EOF", self.n_line, self.n_column) elif estado == 18: if c == '*': estado = 19 elif c == '\n': self.n_line = self.n_line + 1 self.n_column = 1 elif c == '': return Token(Tag.EOF, "EOF", self.n_line, self.n_column - 1) elif estado == 19: if c == '/': estado = 1 else: estado = 18 elif estado == 20: if c.isdigit(): lexema += c else: self.retornaPonteiro() return Token(Tag.NUM_CONST, lexema, self.n_line, self.n_column) elif estado == 21: if c == '"': return Token(Tag.CHAR_CONST, lexema, self.n_line, self.n_column - 1) elif c == '\n': self.n_line = self.n_line + 1 self.n_column = 0 elif c == '': coluna = self.n_column self.n_column = 0 return Token(Tag.CHAR_CONST, lexema, self.n_line, coluna) lexema += c