Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # [rd-prog]: Implementar gramática simples usando descida recursiva
- # Q1) Implemente uma das gramáticas da questão anterior utilizando a técnica de descida recursiva.
- # Q2) Complete o código abaixo que faz a descida recursiva da seguinte gramática:
- grammar = """
- value : lst | var | pair
- lst : "[" [value ("," value)*] "]"
- pair : "(" value ":" value ")"
- """
- import re
- lex = re.compile(r"[a-z]+|[\[\],():]")
- def parse(src):
- """
- Retorna lista a partir da representação como string.
- """
- tokens = [*lex.findall(src), "$"]
- res = value(tokens)
- if tokens != ["$"]:
- raise SyntaxError("espera o fim do arquivo")
- return res
- def expect(tk, tokens):
- """
- Remove primeiro elemento da lista de tokens e sobe erro
- de sintaxe se o elemento não for igual a tk.
- """
- tk_ = tokens.pop(0)
- if tk != tk_:
- raise SyntaxError(f"esperava {tk}, obteve {tk_}")
- def value(tokens):
- # Implemente a regra que lê uma lista de tokens e retorna um
- # valor da linguagem.
- if tokens[0] == "[":
- return lst(tokens)
- ...
- raise SyntaxError
- def lst(tokens):
- # Lê listas
- ...
- def pair(tokens):
- # Lê pares
- ...
- src = "[a,b,(c:d),[ab,cd,ef]]"
- assert parse(src) == ["a", "b", ("c", "d"), ["ab", "cd", "ef"]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement