fabiommendes

Rd-prog

Dec 4th, 2020
454
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # [rd-prog]: Implementar gramática simples usando descida recursiva
  2.  
  3. # Q1) Implemente uma das gramáticas da questão anterior utilizando a técnica de descida recursiva.
  4.  
  5. # Q2) Complete o código abaixo que faz a descida recursiva da seguinte gramática:
  6.  
  7. grammar = """
  8. value : lst | var | pair
  9. lst   : "[" [value ("," value)*] "]"
  10. pair  : "(" value ":" value ")"
  11. """
  12.  
  13. import re
  14. lex = re.compile(r"[a-z]+|[\[\],():]")
  15.  
  16.  
  17. def parse(src):
  18.     """
  19.    Retorna lista a partir da representação como string.
  20.    """
  21.     tokens = [*lex.findall(src), "$"]
  22.     res = value(tokens)
  23.     if tokens != ["$"]:
  24.         raise SyntaxError("espera o fim do arquivo")
  25.     return res
  26.  
  27.  
  28. def expect(tk, tokens):
  29.     """
  30.    Remove primeiro elemento da lista de tokens e sobe erro
  31.    de sintaxe se o elemento não for igual a tk.
  32.    """
  33.     tk_ = tokens.pop(0)
  34.     if tk != tk_:
  35.         raise SyntaxError(f"esperava {tk}, obteve {tk_}")
  36.  
  37.  
  38. def value(tokens):
  39.     # Implemente a regra que lê uma lista de tokens e retorna um
  40.     # valor da linguagem.
  41.     if tokens[0] == "[":
  42.         return lst(tokens)
  43.     ...
  44.     raise SyntaxError
  45.  
  46.  
  47. def lst(tokens):
  48.     # Lê listas
  49.     ...
  50.  
  51.  
  52. def pair(tokens):
  53.     # Lê pares
  54.     ...
  55.    
  56.  
  57. src = "[a,b,(c:d),[ab,cd,ef]]"
  58. assert parse(src) == ["a", "b", ("c", "d"), ["ab", "cd", "ef"]]
  59.  
RAW Paste Data