Beispiel #1
0
 def __init__(self, tokens: list):
     self.itr = MyIterator(tokens)
     self.sintax_analisys = [] # guarda os erros e sucessos do analisador sintático
     self.brackets_stack = [] # balanceamento de { }
     self.notDeclaration = False
     self.statement_dict = {
         "read": self.readProduction,
         "print": self.printStatement,
         "read":self.readStatement,
         "local": self.varScoped,
         "global": self.varScoped,
         "typedef": self.structProduction,
         "if": self.ifProduction,
         "while": self.whileProduction,
     }
     self.global_dict = {
         "var": self.varProduction,  #
         "const": self.varProduction, #
         "function": self.functionProcedure, #
         "procedure": self.functionProcedure, #
     }
     self.main = False
     self.scope = 0 
     self.var_tree = []
     self.const_tree = []
     self.function_tree = []
     self.procedure_tree = []
     self.struct_tree = []
     self.data ={"lexema": "-", "type":"-", "initialized":"-", "scope":"-", "params":"-"}
 def __init__(self, whole_file: str):
     '''
     Construtor da classe GenerateTokens 
     whole_file: String contendo todo o conteúdo do arquivo de entrada
     '''
     self.tokens, self.error_tokens, self.symbols_table = [], [], []
     self.line = 1
     self.lexema = ''
     self.itr = MyIterator(whole_file)
 def __init__(self, tokens: list):
     self.tokens=tokens
     self.itr = MyIterator(tokens)
     self.var_table=[]
     self.const_table=[]
     self.function_table=[]
     self.procedure_table=[]
     self.struct_table=[]
     self.errors=[]
     self.notGlobal = False
     self.scope = 0
class GenerateTokens():
    '''
    Classe responsável por criar os tokens
    '''
    reservedWords = {
        "var", "const", "typedef", "struct", "extends", "procedure",
        "function", "start", "return", "if", "else", "then", "while", "read",
        "print", "int", "real", "boolean", "string", "true", "false", "global",
        "local"
    }
    delimitadores = {";", ",", "(", ")", "{", "}", "[", "]", "."}
    operadoresAritmeticos = {"+", "-", "*", "/", "++", "--"}
    operadoresRelacionais = {"==", "!=", ">", ">=", "<", "<=", "="}
    operadoresLogicos = {"&&", "||", "!"}

    def __init__(self, whole_file: str):
        '''
        Construtor da classe GenerateTokens 
        whole_file: String contendo todo o conteúdo do arquivo de entrada
        '''
        self.tokens, self.error_tokens, self.symbols_table = [], [], []
        self.line = 1
        self.lexema = ''
        self.itr = MyIterator(whole_file)

    def initialState(self) -> list:
        '''
        Estado inicial do autômato.
        Analisa o tipo do caractere atual e transiciona para o próximo estado equivalente.

        Returns:
            getTokens(): Lista de Tokens Válidos
        '''

        while True:
            try:
                self.lexema = ''
                if self.itr.cur == None:
                    return self.getTokens()
                if self.itr.cur.isspace():
                    if self.itr.cur == "\n":
                        self.line += 1
                    self.itr.next()
                elif self.isAscii(self.itr.cur):
                    if self.itr.cur.isidentifier():
                        if self.itr.cur == "_":
                            token = self.symbolState()
                        else:
                            token = self.ideState()
                    elif self.itr.cur.isnumeric():
                        token = self.numberState()
                    else:
                        token = self.symbolState()
                    if isinstance(token, Error_Token):
                        self.error_tokens.append(token)
                    elif isinstance(token, Token) and token != None:
                        self.tokens.append(token)
                else:
                    self.error_tokens.append(
                        Error_Token(OUT_ASCII_ERROR, self.itr.cur, self.line))
                    self.itr.next()
            except StopIteration:
                return self.getTokens()

    def ideState(self) -> Token:
        '''
        Estado de Identificadores, responsável por criar 
        tokens de identificadores e palavras reservadas, transicionando para o estado
        inicial, pós-identificação de token.

        Returns:
            Token(): Token de Identificadores ou Palavra Reservada
        '''
        while (self.itr.cur.isidentifier() or self.itr.cur.isnumeric()
               or self.itr.cur == "_") and self.isAscii(self.itr.cur):
            self.lexema += self.itr.cur
            self.itr.next()
            if self.itr.cur == None:
                break
        if not self.symbols_table.__contains__(
                self.lexema):  # Insere o na tabela de simbolos
            self.symbols_table.append(self.lexema)
        if self.reservedWords.__contains__(
                self.lexema):  # Caso seja uma palavra reservada
            return Token(RW_TOKEN, self.lexema, self.line)
        else:  # Se não for uma palavra reservada, será um identificador
            return Token(ID_TOKEN, self.lexema, self.line)

    def numberState(self) -> Token:
        '''
        Estado inteiro dos Números, responsável por criar 
        tokens de números inteiros. Caso um "." seja encontrado
        ocorrerá uma transição para o estado float, se não, retornará o estado inicial
        pós-identificação de token.

        Returns:
            Token(): Token de Número
            floatState(): Token de Número Float
        '''
        while self.itr.cur.isnumeric():
            self.lexema += self.itr.cur
            self.itr.next()
            if self.itr.cur == None:
                break
        if self.itr.cur == ".":
            self.lexema += self.itr.cur
            return self.floatState()
        else:
            return Token(NUMBER_TOKEN, self.lexema, self.line)

    def floatState(self) -> Token:
        '''
        Estado Decimal dos Números, responsável por criar tokens de números,
        retornando para o estado inicial pós-identificação de token.

        Returns:
            Token(): Token de Número Float
        '''
        self.itr.next()
        if self.itr.cur.isnumeric():
            while self.itr.cur.isnumeric():
                self.lexema += self.itr.cur
                self.itr.next()
                if self.itr.cur == None:
                    break
            return Token(NUMBER_TOKEN, self.lexema, self.line)
        else:
            return Error_Token(NUMBER_ERROR, self.lexema, self.line)

    def symbolState(self) -> Token:
        '''
        Estado de Símbolos, responsável por criar transições para
        os estados equivalentes a cada símbolo. Retornará ao estado inicial Caso
        o símbolo não corresponda a nenhum dos estados.

        Returns:
            stringState(): Token de Cadeia de Caracteres
            commentState(): Token de Comentário
            delimiterState(): Token de Delimitador
            opaState(): Token de Operador Aritmético
            oprState(): Token de Operador Relacional
            oplState(): Token de Operador Lógico
            Error_Token(): Token de Erro 
        '''
        if self.itr.cur == "\"":
            self.lexema += self.itr.cur
            return self.stringState()
        elif self.itr.cur == "/":
            return self.commentState()
        elif self.delimitadores.__contains__(self.itr.cur):
            return self.delimiterState()
        elif self.operadoresAritmeticos.__contains__(self.itr.cur):
            return self.opaState()
        elif self.itr.cur in {"=", "!", ">", "<"}:
            return self.oprState()
        elif self.itr.cur in {"&", "|"}:  # OP.
            return self.oplState()
        else:
            self.itr.next()
            return Error_Token(SYMBOL_ERROR, self.itr.prv, self.line)

    def stringState(self) -> Token:
        """
        Estado de Strings, criando tokens de Cadeia de Caracteres,
        retornando para o estado inicial pós-identificação de token.

        Returns:
            Token(): Token de Cadeia de Caracteres
            Error_Token(): Token de Erro
        """
        contain_no_ascii = False
        self.itr.next()
        while self.itr.cur not in {'"', "\n", None}:
            self.lexema += self.itr.cur
            self.itr.next()
            if self.itr.cur == None:
                break
            elif not self.isAscii(self.itr.cur):
                contain_no_ascii = True
            elif self.itr.cur == "\\" and self.itr.nxt == '"':
                self.lexema += self.itr.cur + self.itr.nxt
                self.itr.next()
                self.itr.next()

        if self.itr.cur == "\"":
            self.lexema += self.itr.cur
            self.itr.next()
            if contain_no_ascii:
                return Error_Token(STRING_NO_ASCII, self.lexema, self.line)
            else:
                return Token(STRING_TOKEN, self.lexema, self.line)
        else:
            self.line += 1  #REVIEW
            self.itr.next()
            return Error_Token(STRING_ERROR, self.lexema, self.line - 1)

    def commentState(self) -> Token:
        """
        Estado de Comentários, criando tokens de comentários,
        retornando para o estado inicial pós-identificação de token.

        Returns:
            Error_Token(): Token de Erro
        """
        self.itr.next()
        if self.itr.cur == "/":
            while self.itr.cur != "\n":
                self.itr.next()
                if self.itr.cur == None:
                    break
            if self.itr.cur == "\n":
                self.line += 1
                self.itr.next()
        elif self.itr.cur == "*":
            skipped_lines = 0
            self.lexema += self.itr.prv + self.itr.cur
            self.itr.next()
            while self.itr.cur != "*" and self.itr.nxt != "/":
                if self.itr.cur == "\n":
                    skipped_lines += 1
                else:
                    self.lexema += self.itr.cur
                self.itr.next()
                if self.itr.cur == None:
                    break
            if self.itr.nxt == None:
                return Error_Token(COMMENT_ERROR, self.lexema, self.line)
            self.itr.next()  # Para pular o */ final
            self.itr.next()
            self.line += skipped_lines
        else:
            return Token(OP_A_TOKEN, self.itr.prv, self.line)

    def delimiterState(self) -> Token:
        """
        Estado de Delimitadores, criando tokens de delimitadores,
        retornando para o estado inicial pós-identificação de token.

        Returns:
            Token(): Token de Delimitador
        """
        self.itr.next()
        return Token(DELIMITER_TOKEN, self.itr.prv, self.line)

    def opaState(self) -> Token:
        """
        Estado de Operador Aritmético, criando tokens de OP. Aritmético,
        retornando para o estado inicial pós-identificação de token.

        Returns:
            Token(): Token de Operador Aritmético
        """
        if self.itr.cur in {"*", "/"}:  #REVIEW / já é pego no comentário
            self.itr.next()
            return Token(OP_A_TOKEN, self.itr.prv, self.line)
        else:
            if self.itr.cur == self.itr.nxt:
                cur, nxt = self.itr.cur, self.itr.nxt
                self.itr.next(
                )  # Pulando os 2 elementos de ++ ou -- e indo para o próximo
                self.itr.next()
                return Token(OP_A_TOKEN, cur + nxt, self.line)
            else:
                self.itr.next()
                return Token(OP_A_TOKEN, self.itr.prv, self.line)

    def oprState(self) -> Token:
        """
        Estado de Operador Relacional, criando tokens de OP. Relacional,
        retornando para o estado inicial pós-identificação de token.

        Returns:
            Token(): Token de Operador Relacional
        """
        if self.itr.nxt == "=":
            cur, nxt = self.itr.cur, self.itr.nxt
            self.itr.next()
            self.itr.next()
            return Token(OP_R_TOKEN, cur + nxt, self.line)
        else:
            if self.itr.cur == "!":
                self.itr.next()
                return Token(OP_L_TOKEN, self.itr.prv, self.line)
            else:
                self.itr.next()
                return Token(OP_R_TOKEN, self.itr.prv, self.line)

    def oplState(self) -> Token:
        """
        Estado de Operador Lógico, criando tokens de OP. Lógico,
        retornando para o estado inicial pós-identificação de token.

        Returns:
            Token(): Token de Operador Lógico
        """
        if self.itr.cur == self.itr.nxt:
            cur, nxt = self.itr.cur, self.itr.nxt
            self.itr.next(
            )  # Pulando os 2 elementos de ++ ou -- e indo para o próximo
            self.itr.next()
            return Token(OP_L_TOKEN, cur + nxt, self.line)
        else:
            self.itr.next()
            return Error_Token(OP_ERROR, self.itr.prv, self.line)

    def isAscii(self, char) -> bool:
        """
        Verifica se o caractere está presente no intervalo do alfabeto aceito pelo
        Analisador Léxico

        Returns:
        32 <= ord(char) <= 126
        """
        return 32 <= ord(char) <= 126

    def getErrorTokens(self) -> list:
        '''
        Retorna a lista de tokens de erro
        Returns:
        self.error_tokens: Lista de Error_Tokens
        '''
        return self.error_tokens

    def getTokens(self) -> list:
        return self.tokens
Beispiel #5
0
class Parser():
    typeOf = {"int", "real", "string", "boolean"}
    variable = {"const", "var"}
    def __init__(self, tokens: list):
        self.itr = MyIterator(tokens)
        self.sintax_analisys = [] # guarda os erros e sucessos do analisador sintático
        self.brackets_stack = [] # balanceamento de { }
        self.notDeclaration = False
        self.statement_dict = {
            "read": self.readProduction,
            "print": self.printStatement,
            "read":self.readStatement,
            "local": self.varScoped,
            "global": self.varScoped,
            "typedef": self.structProduction,
            "if": self.ifProduction,
            "while": self.whileProduction,
        }
        self.global_dict = {
            "var": self.varProduction,  #
            "const": self.varProduction, #
            "function": self.functionProcedure, #
            "procedure": self.functionProcedure, #
        }
        self.main = False
        self.scope = 0 
        self.var_tree = []
        self.const_tree = []
        self.function_tree = []
        self.procedure_tree = []
        self.struct_tree = []
        self.data ={"lexema": "-", "type":"-", "initialized":"-", "scope":"-", "params":"-"}
        
    def sintaxParser(self) -> list:
        self.initProduction()
        return self.getSintaxAnalisys()
    def getTokens(self)->list:
        # tokens = [item for item in self.sintax_analisys if type(item)==Token]
        tokens = []
        for item in self.sintax_analisys:
            if type(item)==Token:
                tokens.append(item)
        return tokens

    def initProduction(self) -> None: # Funcionando corretamente
        while self.itr.cur.lexema in self.global_dict:
            statement = self.global_dict[self.itr.cur.lexema]
            statement()
            if self.itr.cur == None:
                break
        if self.main == False:
            self.sintax_analisys.append("Erro de sintaxe no final do arquivo: Missing procedure start.")

    def statementProduction(self) -> None: # Funcionando corretamente
        self.statementList()

    def statementList(self) -> None: # Funcionando corretamente
        if self.itr.cur != None:
            if self.itr.cur.type == 'IDE':
                if self.itr.nxt.lexema == '(':
                    self.callFunction()
                    self.nextToken(';')
                else:
                    self.varUsage()
                self.statementList()
            elif self.itr.cur.lexema in self.statement_dict:
                statement = self.statement_dict[self.itr.cur.lexema]
                statement()
                self.statementList()
    
    def structProduction(self) -> None: # Funcionando corretamente
            self.nextToken('typedef')
            if self.nextToken('struct'):
                if self.itr.cur.lexema == 'extends':
                    self.nextToken()
                    if self.itr.cur.type == "IDE":
                        self.nextToken()
                    else:
                        self.sintax_analisys.append(SintaxError(self.itr.cur,"Identifier"))
                if self.nextToken('{'):
                    self.scope += 1
                    self.varProduction()
                    self.nextToken('}')
                    if self.itr.cur.type == 'IDE':
                        self.data['lexema'] = self.itr.cur.lexema
                        self.data['scope'] = f"local {self.scope}"
                        self.nextToken()
                    else:
                        self.sintax_analisys.append(SintaxError(self.itr.cur,"Identifier"))
                    self.nextToken(';')
                    try:
                         self.data['type'] = '-'
                         self.data['initialized'] = '-'
                         for item in self.struct_tree:
                             if item.ide == self.data['lexema']:
                                 raise OSError 
                         self.struct_tree.append(DataToken(self.data))
                    except OSError:
                         pass
                                     
    def whileProduction(self) -> None: # Funcionando corretamente
        self.nextToken('while')
        if self.nextToken('('):
            self.expressionProduction()
            self.nextToken(')')
        if self.nextToken('{'):
            self.statementProduction()
            self.nextToken('}')

    def printStatement(self)->None: # Funcionando corretamente
        self.nextToken('print')           
        if self.nextToken('('):
            self.printProduction()
            self.nextToken(')')
        self.nextToken(";")

    def printProduction(self)->None: # Funcionando corretamente
        if self.itr.cur.type == "IDE":
            self.nextToken()
            if self.itr.cur.lexema == '.':
                self.structUsage()
                self.moreExpressions()
            elif self.itr.cur.lexema == '[':
                self.arrayUsage()
                self.moreExpressions()
            else:
                self.moreExpressions()
        elif self.itr.cur.type == "CAD":
            self.nextToken()
            self.moreExpressions()
        elif self.itr.cur.lexema ==")":
            return
        else:
            self.sintax_analisys.append(SintaxError(self.itr.cur,"Valid arguments"))
            self.itr.next()

    def moreExpressions(self)->None: # Funcionando corretamente
        if self.itr.cur.lexema==",":
            self.nextToken()
            self.printProduction()

    def structUsage(self)-> None: # Funcionando corretamente
        if self.itr.cur.lexema == '.':
            self.nextToken()
            if self.itr.cur.type == "IDE":
                self.nextToken()

    def arrayUsage(self)-> None: # Funcionando corretamente
        exp = {"IDE","NRO","CAD","true","false"}
        if self.nextToken('['):
            if self.itr.cur.type in exp or self.itr.cur.lexema in exp:
                self.nextToken()
                self.nextToken(']')
                if self.itr.cur.lexema == '[':
                    self.nextToken()
                    if self.itr.cur.type in exp or self.itr.cur.lexema in exp:
                        self.nextToken()
                        self.nextToken(']')
                    else:
                        self.sintax_analisys.append(SintaxError(self.itr.cur,"Valid expressions"))
                        self.itr.next()
            else:
                self.sintax_analisys.append(SintaxError(self.itr.cur,"Valid expressions"))
                self.itr.next()
               
    def readStatement(self)->None: # Funcionando corretamente
        self.nextToken('read')           
        if self.nextToken('('):
            self.readProduction()
            self.nextToken(')')
        self.nextToken(";")

    def readProduction(self)->None: # Funcionando corretamente
        if self.itr.cur.type == "IDE":
            self.nextToken()
            if self.itr.cur.lexema == '.':
                self.structUsage()
                self.moreReadings()
            elif self.itr.cur.lexema == '[':
                self.arrayUsage()
                self.moreReadings()
            else:
                self.moreReadings()
        elif self.itr.cur.lexema ==")":
            return
        else:
            self.sintax_analisys.append(SintaxError(self.itr.cur,"Valid read"))
            self.itr.next()

    def moreReadings(self)->None: # Funcionando corretamente
        if self.itr.cur.lexema==",":
            self.nextToken()
            self.readProduction()

    def ifProduction(self) -> None: # Funcionando corretamente
        self.nextToken('if')           
        if self.nextToken('('):
            self.expressionProduction()
            self.nextToken(')')
        self.nextToken('then')      
        if self.nextToken('{'):
            self.statementProduction()
            self.nextToken('}')    
        if self.itr.cur.lexema == 'else':
            self.elseStatement()

    def elseStatement(self) -> None: # Funcionando corretamente
        self.nextToken()
        if self.nextToken('{'):
            self.statementProduction()
            self.nextToken('}')

    def functionProcedure(self) -> None: # Funcionando corretamente
        self.data['initialized'] = '-'
        if self.itr.cur.lexema == 'procedure':
            self.nextToken()
            self.procedureBody()
        elif self.itr.cur.lexema == 'function':
            self.nextToken()
            if self.itr.cur.lexema in self.typeOf:
                self.data['type'] = self.itr.cur.lexema
                self.nextToken()
                self.functionBody()
            else:
                self.sintax_analisys.append(SintaxError(self.itr.cur,"Valid Type"))
        self.data ={"lexema": "-", "type":"-", "initialized":"-", "scope":"-", "params":"-"}

            
    def procedureBody(self) -> None: # Funcionando corretamente
        self.notDeclaration = True
        if self.itr.cur.lexema == "start":
            self.main = True
            self.nextToken()
            if self.nextToken('{'):
                self.scope += 1
                while self.itr.cur.lexema in {'var','const'}:
                    statement = self.global_dict[self.itr.cur.lexema]
                    statement()
                self.statementProduction()
                self.nextToken('}')
                self.notDeclaration = False
        elif self.itr.cur.type == "IDE":
            self.data['lexema'] = self.itr.cur.lexema
            self.nextToken()
            self.paramsProduction()
            try:
                self.data['scope'] = f"local {self.scope + 1}"
                for item in self.procedure_tree:
                    if item.ide == self.data['lexema']:
                        raise OSError 
                self.procedure_tree.append(DataToken(self.data))
            except OSError:
                pass
            if self.nextToken('{'):
                self.scope += 1
                while self.itr.cur.lexema in {'var','const'}:
                    statement = self.global_dict[self.itr.cur.lexema]
                    statement()
                self.statementProduction()
                self.nextToken('}')
        else:
            self.sintax_analisys.append(SintaxError(self.itr.cur,"Identifier or start"))
            self.itr.next()
        self.notDeclaration = False
        
    
    def functionBody(self) -> None: # Funcionando corretamente
        self.notDeclaration = True
        if self.itr.cur.type == "IDE":
            self.data['lexema'] = self.itr.cur.lexema
            self.nextToken()
            self.paramsProduction()
            try:
                self.data['scope'] = f"local {self.scope + 1}"
                for item in self.function_tree:
                    if item.ide == self.data['lexema']:
                        raise OSError 
                self.function_tree.append(DataToken(self.data))
            except OSError:
                pass
            if self.nextToken('{'):
                self.scope += 1
                while self.itr.cur.lexema in {'var','const'}:
                    statement = self.global_dict[self.itr.cur.lexema]
                    statement()
                self.statementProduction()
                self.returnProduction()
                self.nextToken('}')
        else:
            self.sintax_analisys.append(SintaxError(self.itr.cur,"Identifier"))
            self.itr.next()
        self.notDeclaration = False

    def expressionProduction(self) -> None: 
        self.orExpression()

    def orExpression(self) -> None:
        self.andExpression()
        if self.itr.cur.lexema=="||":
            self.nextToken()
            self.orExpression()

    def andExpression(self) -> None:
        self.equalityExpression()
        if self.itr.cur.lexema=="&&":
            self.nextToken()
            self.andExpression()
    
    def equalityExpression(self) -> None:
        equality = {"==", "!="}
        self.compareExpression()
        if self.itr.cur.lexema in equality:
            self.nextToken()
            self.equalityExpression()

    def compareExpression(self) -> None:
        compare = {">", "<",">=","<="}
        self.addExpression()
        if self.itr.cur.lexema in compare:
            self.nextToken()
            self.compareExpression()

    def addExpression(self) -> None:
        add = {"+", "-"}
        self.multiplicationExpression()
        if self.itr.cur.lexema in add:
            self.nextToken()
            self.addExpression()

    def multiplicationExpression(self) -> None:
        exp = {"*", "/"}
        self.notExpression()
        if self.itr.cur.lexema in exp:
            self.nextToken()
            self.multiplicationExpression() 

    def notExpression(self) -> None:
        exp = {"IDE","NRO","CAD","true","false"}
        if self.itr.cur.lexema == "!":
            self.nextToken()
            self.notExpression()
        elif self.itr.cur.lexema == "(":
            self.nextToken()
            self.expressionProduction()
            self.nextToken(')')
        elif self.itr.cur.type in exp or self.itr.cur.lexema in exp:
            self.nextToken()
        elif self.itr.cur.type in {'global','local'}:
            self.nextToken()
            self.nextToken('.')
            if self.itr.cur.type == 'IDE':
                self.nextToken()
                self.expressionProduction()
            
        else:
            self.sintax_analisys.append(SintaxError(self.itr.cur,"Valid expression"))
            self.itr.next()
                   
    def paramsProduction(self) -> None: # Funcionando corretamente
        if self.nextToken('('):
            self.data['params'] = []
            self.params()
            self.nextToken(')')

    def params(self) -> None: # Funcionando corretamente
        if self.itr.cur.lexema in self.typeOf:
            self.data['params'].append(self.itr.cur.lexema)
            self.nextToken()
            if self.itr.cur.type == 'IDE':
                self.nextToken()
                if self.itr.cur.lexema == ',':
                    self.nextToken()
                    self.params()

    def callFunction(self) -> None: # Funcionando corretamente
        if self.itr.cur.type == 'IDE':
            self.nextToken()
            if self.nextToken('('):
                self.args()
                self.nextToken(')')
                

    def args(self) -> None: # Funcionado corretamente
        exp = {"IDE","NRO","CAD","true","false"}
        if self.itr.cur.type in exp or self.itr.cur.lexema in exp:
            self.nextToken()
            if self.itr.cur.lexema == ",":
                self.nextToken()
                self.args()

    def returnProduction(self) -> None:  # Funcionando corretamente
        exp = {"NRO","CAD","true","false"}
        if self.nextToken('return'):
            if self.itr.cur.type in exp or self.itr.cur.lexema in exp:
                self.nextToken()
                self.nextToken(';')
            elif self.itr.cur.type == 'IDE':
                if self.itr.nxt.lexema == "(":
                    self.callFunction()
                else:
                    self.expressionProduction()
                self.nextToken(';')
            elif self.itr.cur.lexema == '(':
                self.nextToken()
                self.expressionProduction()
                self.nextToken(')')
                self.nextToken(';')
            elif self.itr.cur.lexema in {'global','local'}:
                self.varScoped()
            else:
                self.sintax_analisys.append(SintaxError(self.itr.cur,"Valid return"))
                self.itr.next()

    
    def varProduction(self) -> None: # Funcionando corretamente
        if self.itr.cur == None:
            return
        elif self.itr.cur.lexema == 'var':
            self.nextToken()
            if self.nextToken('{'):
                self.varDeclaration()
                self.nextToken('}')
                self.varProduction()
        elif self.itr.cur.lexema == 'const':
            self.nextToken()
            if self.nextToken('{'):
                self.constDeclaration()
                self.nextToken('}')
                self.varProduction()
        

    def varDeclaration(self) -> None: # Funcionando corretamente
        if self.itr.cur.lexema in self.typeOf:
            self.data["type"] = self.itr.cur.lexema #pegamos o tipo
            self.nextToken()
            self.variables()
            self.nextToken(';')
            self.varDeclaration()
        elif self.itr.cur.lexema == '}':
            return
        else:
            self.sintax_analisys.append(SintaxError(self.itr.cur,"Valid type"))

    def variables(self) -> None: # Funcionando corretamente
        if self.itr.cur.type == 'IDE':
            self.data["lexema"] = self.itr.cur.lexema #pegamos o token
            self.nextToken()
            if self.itr.cur.lexema == '=':
                self.data["t"] = True
                self.nextToken()
                if self.itr.cur.type == 'IDE':
                    if self.itr.nxt.lexema == '(':
                        self.callFunction()
                    elif self.itr.nxt.lexema == '.':
                        self.nextToken()
                        self.structUsage()
                    elif self.itr.nxt.lexema == '[':
                        self.nextToken()
                        self.arrayUsage()
                    else:
                        self.expressionProduction()
                elif self.itr.cur.lexema in {'global', 'local'}:
                        self.nextToken()
                        self.nextToken('.')
                        if self.itr.cur.type == 'IDE':
                            if self.itr.cur.lexema == '[':
                                self.nextToken()
                                self.arrayUsage()
                            else:
                                self.expressionProduction()  
                else:
                    self.expressionProduction()
            elif self.itr.cur.lexema == '[':
                self.arrayUsage()
                if self.itr.cur.lexema == '=':
                    self.nextToken()
                    if self.itr.cur.lexema == '{':
                        self.nextToken()
                        self.varArg()
                        self.nextToken('}')
                    elif self.itr.cur.lexema in {'local','global'}:
                        self.nextToken()
                        self.nextToken('.')
                        if self.itr.cur.type == 'IDE':
                            self.nextToken()
            if self.notDeclaration == False:
                self.data["scope"] = "global"
            else:
                self.data["scope"] = f"local {self.scope}"
            self.data["params"] = '-'
            if self.data['initialized'] == '-':
                self.data['initialized'] = False
            try:
                for item in self.var_tree:
                    if item.scope == self.data['scope'] and item.ide == self.data['lexema']:
                        raise OSError 
                self.var_tree.append(DataToken(self.data))
            except OSError:
                pass
        else:
            self.sintax_analisys.append(SintaxError(self.itr.cur,"Identifier"))
            self.itr.next()
        if self.itr.cur.lexema == ',':
            self.nextToken()
            self.variables()

    def varArg(self) -> None: # Funcionando corretamente
        exp = {'IDE','NRO','CAD','true','false'}
        if self.itr.cur.type in exp or self.itr.cur.lexema in exp:
            self.nextToken()
            if self.itr.cur.lexema == ',':
                self.nextToken()
                self.varArg()
        else:
            self.sintax_analisys.append(SintaxError(self.itr.cur,"Valid values"))
            self.itr.next()

    def varUsage(self) -> None: # Funcionando corretamente
        exp = {'IDE','NRO','CAD','true','false'}
        if self.itr.cur.type == 'IDE':
            if self.itr.nxt.lexema == '.':
                self.nextToken()
                self.structUsage()
                if self.itr.cur.lexema == '=':
                    self.nextToken()
                    if self.itr.cur.type == 'IDE':
                        if self.itr.nxt.lexema == '(':
                            self.callFunction()
                        elif self.itr.nxt.lexema == '.':
                            self.nextToken()
                            self.structUsage()
                        elif self.itr.nxt.lexema == '[':
                            self.nextToken()
                            self.arrayUsage()
                        else:
                            self.expressionProduction()
                    elif self.itr.cur.lexema in {'global', 'local'}:
                        self.nextToken()
                        self.nextToken('.')
                        if self.itr.cur.type == 'IDE':
                            if self.itr.cur.lexema == '[':
                                self.nextToken()
                                self.arrayUsage()
                            else:
                                self.expressionProduction()  
                        else:
                            self.sintax_analisys.append(SintaxError(self.itr.cur,"Identifier"))
                    else:
                        self.expressionProduction()
            elif self.itr.nxt.lexema == '[':
                self.nextToken()
                self.arrayUsage()
                if self.itr.cur.lexema == '=':
                    self.nextToken()
                    if self.itr.cur.type == 'IDE':
                        if self.itr.nxt.lexema == '.':
                            self.nextToken()
                            self.structUsage()
                        elif self.itr.nxt.lexema == '[':
                            self.nextToken()
                            self.arrayUsage()
                    if self.itr.cur.type in exp or self.itr.cur.lexema in exp:
                        self.nextToken()
                    elif self.itr.cur.lexema in {'global', 'local'}:
                        self.nextToken()
                        self.nextToken('.')
                        if self.itr.cur.type == 'IDE':
                            self.nextToken()
                        else:
                            self.sintax_analisys.append(SintaxError(self.itr.cur,"Identifier"))
            else:
                self.variables()
            self.nextToken(';')

    def varScoped(self) -> None: # Funcionando corretamente
        self.nextToken()
        self.nextToken('.')
        self.variables()
        self.nextToken(';')

    def constDeclaration(self) -> None: # Funcionando corretamente
        if self.itr.cur.lexema in self.typeOf:
            self.data["type"] = self.itr.cur.lexema #pegamos o tipo
            self.nextToken()
            self.constants()
            self.nextToken(';')
            self.constDeclaration()
    
    def constants(self) -> None: # Funcionando corretamente       
        exp = {'IDE','NRO','CAD','true','false'}
        if self.itr.cur.type == 'IDE':
            self.data["lexema"] = self.itr.cur.lexema #pegamos o token
            self.nextToken()
            if self.nextToken('='):
                self.data["t"] = True
                if self.itr.cur.type in exp or self.itr.cur.lexema in exp:
                    self.nextToken()
            if self.notDeclaration == False:
                self.data["scope"] = "global"
            else:
                self.data["scope"] = f"local {self.scope}"
            self.data["params"] = '-'
            try:
                for item in self.const_tree:
                    if item.scope == self.data['scope'] and item.ide == self.data['lexema']:
                        raise OSError 
                self.const_tree.append(DataToken(self.data))
            except OSError:
                pass
            if self.itr.cur.lexema == ',':
                    self.nextToken()
                    self.constants()
            
        else:
            self.sintax_analisys.append(SintaxError(self.itr.cur,"Identifier"))

    def nextToken(self, lexema = None) -> bool:
        # balanceamento de {}, para indicar se ficou faltando fechar algo
        if self.itr.cur != None:
            # self.bracketsBalance()
            if self.itr.cur.lexema == lexema or lexema == None:
                self.sintax_analisys.append(self.itr.cur)
                self.itr.next()
                return True
            else:
                self.sintax_analisys.append(SintaxError(self.itr.cur, lexema))
                self.itr.next()
                return False
        else:
            self.sintax_analisys.append(f'Erro de sintaxe no final do arquivo: Expected:"{lexema}", got "None"')

    def bracketsBalance(self) -> None:
        if self.itr.cur.lexema == '{':
            self.brackets_stack.append(self.itr.cur)
        elif self.itr.cur.lexema == '}':
            self.brackets_stack.pop()

    def getSintaxAnalisys(self) -> list:
        return self.sintax_analisys
Beispiel #6
0
if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument("--batch_size", default=16, type=int)
    parser.add_argument("--lr", default=0.01, type=float)
    parser.add_argument("--num_workers", default=8, type=int)
    parser.add_argument("--wt_dec", default=5e-4, type=float)
    parser.add_argument('--gpu', '-g', type=int, default=0, help='GPU ID (negative value indicates CPU)')
    parser.add_argument('--out', '-o', default='result', help='Directory to output the result')
    args = parser.parse_args()

    config=Config()

    train_dataset, _, _, identityn = celebA_load(config)
    train_iter = MyIterator(config, train_dataset, args.batchsize)

    opts = {}
    encoder=InceptionResNetV2()
    serializers.load_npz(config.pretrainmodel_path, encoder)
    d2ae=network.D2AE(encoder, identityn).to_gpu()
    ip=network.Identity(identityn).to_gpu()

    models = [d2ae,ip]
    updater_args = {
        "iterator": {'main': train_iter},
        "device": args.gpu
    }

    opts["opt_d2ae"] = make_sgd_optimizer(d2ae, args.lr)
    opts["opt_ip"] = make_sgd_optimizer(ip, args.lr)