Do token à estrutura
A análise léxica produz unidades; a análise sintática organiza essas unidades.
Semana 4 · teoria · FGA0003 — Compiladores 1
A análise léxica produz unidades; a análise sintática organiza essas unidades.
A análise sintática de linguagens de programação é baseada, em grande parte, em gramáticas livres de contexto.
Em G = (V, Σ, P, S), qual componente contém as regras de produção?
Uma GLC descreve como construir sentenças válidas a partir de regras de produção.
Uma gramática livre de contexto é definida por G = (V, Σ, P, S).
Categorias abstratas, como expr, term, factor ou decl.
Tokens concretos, como ID, NUM, +, *, (, ) e ;.
Regras que indicam como uma categoria pode ser expandida.
Símbolo a partir do qual a análise começa.
E → E + E | E * E | (E) | id
S → aSb | ab
Decl → int id = num ;
Bloco → { lista_comandos }
Qual regra possui a forma válida de uma produção de GLC?
A gramática não apenas aceita ou rejeita: ela mostra a estrutura da sentença.
Derivar é aplicar produções sucessivamente até obter apenas terminais.
A árvore explicita a hierarquia sintática produzida pelas regras da gramática.
Considere S → aSb | ab. Qual cadeia pode ser gerada por essa gramática?
Nem toda gramática adequada para gerar sentenças é adequada para um parser sem ajustes.
A gramática E → E + E | E * E | id permite mais de uma árvore para a mesma expressão.
A pilha permite reconhecer estruturas que exigem memória de aninhamento ou contagem.
Autômatos finitos não guardam memória suficiente para reconhecer dependências como aⁿbⁿ ou parênteses aninhados.
Por que a pilha é útil para reconhecer a linguagem aⁿbⁿ?
Bison recebe regras gramaticais e gera código C para o analisador sintático.
O arquivo do Bison organiza declarações, regras gramaticais e código auxiliar.
O scanner gerado pelo Flex retorna tokens para o parser gerado pelo Bison.
Qual artefato permite que o scanner use os tokens definidos pelo Bison?
Transformar a lista de tokens em primeiras regras gramaticais.
Implementar um parser inicial com Bison.
Código-base e materiais: https://github.com/sergioaafreitas/COMP1
Manter README, testes e commits organizados desde o início.
Define a estrutura sintática das sentenças da linguagem.
Mostra a aplicação progressiva das produções.
Torna explícita a hierarquia sintática.
Fornece o modelo conceitual com pilha.
Gera o parser a partir da gramática.
Fornece os tokens que alimentam o parser.
Implementação inicial do parser com Bison, integrando o scanner desenvolvido com Flex. Materiais e código-base: https://github.com/sergioaafreitas/COMP1