def parseCommand(): if (Parser.tokens.actual.token_type == "PTVIRGULA"): node = NoOp() Parser.tokens.selectNext() return node elif (Parser.tokens.actual.token_type == "DATA_TYPE"): identifier = Identifier() identifier.tipo = Parser.tokens.actual.value Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "NOME"): identifier.value = Parser.tokens.actual.value Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "EQUAL"): node = Assignment(Parser.tokens.actual.value) Parser.tokens.selectNext() node.children.append(identifier) node.children.append(Parser.parseRelexpr()) if (Parser.tokens.actual.token_type == "PTVIRGULA"): Parser.tokens.selectNext() return node else: raise ValueError('Esperado um ponto e virgula') else: raise ValueError('Esperado um assignment') elif (Parser.tokens.actual.token_type == "LOG"): node = Echo(Parser.tokens.actual.value) Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "APAR"): Parser.tokens.selectNext() node.children.append(Parser.parseRelexpr()) if (Parser.tokens.actual.token_type == "FPAR"): Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "PTVIRGULA"): Parser.tokens.selectNext() return node else: raise ValueError('Esperado um ponto e virgula') else: raise ValueError('Esperado um parentesis') else: raise ValueError('Esperado um parentesis') elif (Parser.tokens.actual.token_type == "IF"): node = If(Parser.tokens.actual.value) Parser.tokens.selectNext() node.children.append(Parser.parseRelexpr()) # if(Parser.tokens.actual.token_type == "INTERR"): # Parser.tokens.selectNext() node.children.append(Parser.parseCommand()) # if(Parser.tokens.actual.token_type == "DOISP"): # Parser.tokens.selectNext() node.children.append(Parser.parseCommand()) return node # else: # return node # else: # raise ValueError('Esperado um parenteses') elif (Parser.tokens.actual.token_type == "WHILE"): node = While(Parser.tokens.actual.value) Parser.tokens.selectNext() node.children.append(Parser.parseRelexpr()) node.children.append(Parser.parseCommand()) return node elif (Parser.tokens.actual.token_type == "FUNCTION"): Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "NOME"): node = FuncDec(Parser.tokens.actual.value) Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "EQUAL"): Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "DATA_TYPE"): node.return_type = Parser.tokens.actual.value Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "APAR"): Parser.tokens.selectNext() while (True): if (Parser.tokens.actual.token_type == "DATA_TYPE"): identifier = Identifier() identifier.tipo = Parser.tokens.actual.value Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "NOME"): identifier.value = Parser.tokens.actual.value Parser.tokens.selectNext() node.children.append(identifier) if (Parser.tokens.actual.token_type == "VIRGULA"): Parser.tokens.selectNext() elif (Parser.tokens.actual.token_type == "FPAR"): Parser.tokens.selectNext() node.children.append( Parser.parseBlock()) return node else: raise ValueError( "Esperado uma virgula ou parentesis" ) elif (Parser.tokens.actual.token_type == "FPAR" ): Parser.tokens.selectNext() node.children.append(Parser.parseBlock()) return node else: raise ValueError("Esperado um identifier") else: raise ValueError("Esperado um parentesis") else: raise ValueError( "Esperado o tipo do retorno da funcao") else: raise ValueError("Esperado o nome da funcao") elif (Parser.tokens.actual.token_type == "RETURN"): node = Return(Parser.tokens.actual.token_type) Parser.tokens.selectNext() node.children.append(Parser.parseRelexpr()) if (Parser.tokens.actual.token_type == "PTVIRGULA"): Parser.tokens.selectNext() return node else: raise ValueError('Esperado um ponto e virgula') elif (Parser.tokens.actual.token_type == "NOME"): node = FuncCall(Parser.tokens.actual.value) Parser.tokens.selectNext() if (Parser.tokens.actual.token_type == "APAR"): Parser.tokens.selectNext() while (True): if (Parser.tokens.actual.token_type == "FPAR"): Parser.tokens.selectNext() return node else: node.children.append(Parser.parseRelexpr()) if (Parser.tokens.actual.token_type == "VIRGULA"): Parser.tokens.selectNext() elif (Parser.tokens.actual.token_type == "FPAR"): Parser.tokens.selectNext() return node else: raise ValueError( "Esperado uma virgula ou parentesis") else: raise ValueError("Esperado um parentesis") else: return Parser.parseBlock()