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.