def comando_composto(): global tokens, indice, contador, var, operador if tokens[indice].sIdentificador == "begin": #Incrementa o escopo contador += 1 indice += 1 comandos_opcionais() if tokens[indice].sIdentificador == "end": #Decrementa o escopo contador -= 1 #Se o contador for 0 é pra limpar um escopo if contador == 0: semantico.saidaEscopo() semantico.printPilha() indice += 1 else: print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado a palavra reservada 'end'") return True else: #print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado a palavra reservada 'begin'") return False
def lista_de_identificadores2(): global tokens, indice, contador, var, operador if tokens[indice].sIdentificador == ",": indice += 1 if tokens[indice].classificacao == "identificador": #Adiciona identificador na pilha v = idtipo(tokens[indice].sIdentificador, "0") semantico.declaracao(v) semantico.printPilha() indice += 1 lista_de_identificadores2() else: print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado um identificador após ','")
def lista_de_identificadores(): global tokens, indice, contador, var, operador if tokens[indice].classificacao == "identificador": #Adiciona identificador na pilha v = idtipo(tokens[indice].sIdentificador, "0") semantico.declaracao(v) semantico.printPilha() indice += 1 lista_de_identificadores2() return True else: return False
def programa(): global tokens, indice, contador, var, operador if tokens[indice].sIdentificador == "program": #Abre escopo semântico semantico.entradaEscopo() semantico.printPilha() indice += 1 if tokens[indice].classificacao == "identificador": #Adiciona identificador na pilha v = idtipo(tokens[indice].sIdentificador, "program") semantico.declaracao(v) semantico.printPilha() indice += 1 if tokens[indice].sIdentificador == ";": indice += 1 declaracoes_de_variaveis() declaracoes_de_subprogramas() comando_composto() if tokens[indice].sIdentificador != ".": print(tokens[indice].sIdentificador) print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado o delimitador '.'") else: print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado o delimitador ';'") else: print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado um identificador após a palavra 'program'") else: print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado a palavra 'program'")
def declaracao_de_subprograma(): global tokens, indice, contador, var, operador if tokens[indice].sIdentificador == "procedure": indice += 1 if tokens[indice].classificacao == "identificador": #Adiciona identificador na pilha v = idtipo(tokens[indice].sIdentificador, "procedure") semantico.declaracao(v) semantico.printPilha() #Abre um novo escopo semantico.entradaEscopo() indice += 1 argumentos() if tokens[indice].sIdentificador == ';': indice += 1 declaracoes_de_variaveis() declaracoes_de_subprogramas() comando_composto() else: print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado o delimitador ';'") else: print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado um identificador após 'procedure'") return True else: return False
def tipo(): global tokens, indice, contador, var, operador if tokens[indice].sIdentificador == "integer": indice += 1 #Adiciona identificador semantico.atribuiTipo("inteiro") semantico.printPilha() elif tokens[indice].sIdentificador == "real": indice += 1 #Adiciona identificador semantico.atribuiTipo("real") semantico.printPilha() elif tokens[indice].sIdentificador == "boolean": indice += 1 #Adiciona identificador semantico.atribuiTipo("logico") semantico.printPilha() else: print(tokens[indice].nLinha + ": ERRO! Sintax inválida. Era esperado as palavras reservadas 'integer', 'real' ou 'boolean'")