Aula 10: Exemplo de Implementação de Parser LL

Objetivos

  • Hands-on: Implementando um parser na prática.
  • Estratégias de tratamento de erro (Panic Mode).

Conteúdo

A teoria se solidifica na prática. Vamos analisar a implementação de um parser do tipo Descida Recursiva (Recursive Descent), que é o tipo mais intuitivo de escrever à mão.

Mapeamento Gramática \(\to\) Código

Cada Não-Terminal vira uma função (método). O corpo da função segue o lado direito da produção.

Gramática:

T -> F T'
T' -> * F T' | epsilon
F -> ( E ) | id

Código Java:

void parseT() {
    parseF();
    parseT_prime();
}

void parseT_prime() {
    if (currentToken.type == MULT) { // Regra: * F T'
        match(MULT);
        parseF();
        parseT_prime();
    }
    // else: Regra epsilon (não faz nada, apenas retorna)
}

Tratamento de Erro (Panic Mode)

Um compilador não deve travar no primeiro erro de sintaxe. Queremos reportar o erro e continuar encontrando outros. - Estratégia Pânico: Ao encontrar um token inesperado: 1. Emita mensagem de erro. 2. Entre num loop while consumindo (jogando fora) tokens até encontrar um símbolo de Sincronização seguro (ex: ; ou end ou )). 3. A pilha de chamadas desenrola e o parser tenta retomar a análise a partir dali.

Referências

  • Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools.
  • Cooper, K., & Torczon, L. (2011). Engineering a Compiler.
Back to top