flowchart LR
M09["Módulo 9<br/>Autômatos de pilha<br/>modelo abstrato<br/>sem implementação"]
M10["Módulo 10<br/>Análise sintática<br/>descendente<br/>MARCO: front-end pronto"]
M11["Módulo 11<br/>Análise sintática<br/>ascendente<br/>CONCEITUAL, à mão"]
M12["Módulos 12 a 15<br/>Semântica, representação<br/>intermediária, geração<br/>e otimização"]
M09 --> M10 --> M11 --> M12
subgraph ENTREGA["O que este módulo deixa pronto"]
D1["Tabela ascendente<br/>construída à mão sobre<br/>a gramática do grupo"]
D2["Conflitos identificados,<br/>classificados e<br/>explicados"]
D3["Comparação entre as<br/>duas famílias, específica<br/>ao caso do grupo"]
D4["Plano do terceiro bloco<br/>com divisão de trabalho"]
end
M11 --- ENTREGA
D1 -.->|"leitura de relatório<br/>de gerador"| D2
D4 -.->|"fases fortemente<br/>acopladas"| M12
Análise Sintática Ascendente — Plano de Aula
Documento exclusivo do professor. Guia operacional das seis aulas do módulo 11: roteiro por blocos das duas aulas teóricas, plano das quatro aulas de tutoria, entregáveis e riscos antecipados. Não distribua à turma — as questões de discussão perdem a função no instante em que o estudante lê a resposta antes de votar.
Visão Geral do Módulo
Onde este módulo fica — depois do marco do front-end e antes do bloco final, é a única parada do semestre para escolher com os dois lados na mesa.
Este é o segundo e último módulo sem implementação, e a razão é diferente da do módulo 9. Lá o modelo abstrato não virou código porque a realização concreta viria no módulo seguinte. Aqui o método estudado não vai virar código nunca: o projeto tomou o caminho descendente no módulo 10 e essa decisão está travada. A turma percebe isso já no bloco de abertura e alguém vai perguntar, em voz alta ou pelo silêncio, para que serve estudar o caminho que não se tomou. Tenha a resposta pronta e dê-a antes de ser cobrada: a família ascendente é a que está por trás de todo gerador de analisadores que o egresso vai encontrar, e quem nunca construiu uma tabela dessas à mão lê um relatório de conflitos como quem lê horóscopo — sabe que algo está errado, não sabe o quê nem onde.
Conduza o módulo inteiro por uma inversão, não por um catálogo. No módulo 10 a turma passou seis transformações eliminando recursão à esquerda e fatorando prefixos, e aceitou aquilo como o preço da análise sintática. Não é: é o preço de um método. O que se descobre aqui é que a recursão à esquerda, fatal do outro lado, é a forma preferida deste. Essa é a moeda que paga as duas aulas, e é dela que sai a lição transferível do fechamento — nenhuma das dificuldades enfrentadas era dificuldade do problema, todas eram dificuldade da abordagem escolhida.
O risco de condução é oposto ao do módulo 9. Lá o perigo era o abstrato sem chão; aqui é a aula virar desfile de quatro siglas com quatro tabelas, que a turma copia e não usa. O critério de sucesso não é a turma saber definir os quatro métodos: é a turma saber dizer, diante de um estado com item completo e item de deslocamento, que informação está faltando e qual nível a fornece.
Objetivos, Competências e Habilidades
Objetivos de aprendizagem. Apresentar a família de métodos dominante nos compiladores de produção e desenvolver a capacidade de escolher entre as duas famílias com base em critérios técnicos. Habilitar a leitura de relatórios de conflito produzidos por ferramentas automáticas.
Competências a desenvolver. Capacidade de avaliar alternativas técnicas por poder, custo e adequação ao contexto, em vez de por preferência ou familiaridade. Capacidade de operar uma ferramenta cujo funcionamento interno se compreende, interpretando seus diagnósticos em termos da especificação fornecida.
Habilidades a adquirir. Explicar a estratégia ascendente em termos de deslocamento, redução e alça. Construir manualmente a tabela de análise para uma gramática pequena. Identificar e classificar conflitos de deslocamento-redução e de redução-redução, e explicar sua origem. Comparar as duas famílias quanto a poder, legibilidade, qualidade de diagnóstico e manutenção. Interpretar o relatório de conflitos de um gerador.
Estrutura das Aulas
Aulas 1 e 2 — Aula Teórica
Roteiro por blocos — cada bloco existe porque o anterior deixou uma decisão sem critério.
Bloco de abertura — a gramática que estragamos
Chegue com as duas versões da gramática de expressões projetadas lado a lado: a original, com recursão à esquerda, e a transformada que o módulo 10 exigiu, com as variáveis auxiliares e as produções vazias que a eliminação introduziu. Não anuncie o assunto do dia. Pergunte só isto: quanto do que está do lado direito é exigência do problema e quanto é exigência do método que escolhemos?
A turma responde “do problema”, porque foi assim que o módulo 10 foi vivido — a transformação apareceu como obrigação, não como escolha. Escreva então E \to E + T no quadro, circule, e diga uma frase e nada mais: existe uma família de métodos para a qual esta forma não é obstáculo, é a preferida. Deixe a afirmação em aberto e não a justifique ainda; ela é a dívida que segura as duas aulas.
Feche o bloco nomeando a pergunta que o módulo responde e que não é “como funciona o método ascendente”, e sim “por que aprendemos primeiro o outro, se este é mais poderoso”. Escreva a pergunta no canto do quadro e não a apague — você volta a ela no fechamento da segunda aula.
Bloco seguinte — duas operações e a pilha ao contrário
Apresente a mecânica pela economia dela, porque impressiona: duas operações e dois casos terminais. Deslocar transfere o próximo símbolo da entrada para o topo da pilha. Reduzir por A \to \beta retira do topo os símbolos que formam \beta e empilha A. Aceita quando a entrada acabou e a pilha tem só o símbolo inicial.
Aqui está o ponto em que se perde mais gente no módulo, e ele merece o quadro inteiro: no método dirigido por tabela do módulo 10 a pilha guardava o que falta reconhecer; aqui guarda o que já foi reconhecido. Mesma estrutura, significado oposto. Não descreva isso verbalmente — desenhe. Divida o quadro ao meio, tome uma cadeia curta e trace os dois reconhecimentos em paralelo, uma linha de cada lado por vez, e deixe a sala ver uma pilha encolher onde a outra cresce. Quem sai deste bloco com a intuição errada lê todos os traçados seguintes ao contrário.
Introduza alça com a definição que dá o teste de verificação: a alça é a subcadeia cuja redução desfaz o último passo de uma derivação mais à direita. Daí sai o instrumento mais barato do módulo, e diga-o em voz alta duas vezes porque a turma vai precisar dele na tutoria — terminado um traçado, leia as reduções de trás para a frente; se elas regeneram a cadeia, o traçado está certo.
Termine formulando o problema em uma frase única, escrita no quadro: decidir, em tempo constante, se o topo da pilha é uma alça e por qual produção reduzi-la.
Bloco seguinte — o resultado que ninguém espera
Defina prefixo viável como o conteúdo de pilha que ainda pode levar a uma cadeia da linguagem, e então dê o teorema publicado por Knuth em 1965: para toda gramática livre de contexto, o conjunto dos prefixos viáveis é uma linguagem regular, logo reconhecível por um autômato finito.
Alguém sempre levanta a objeção certa, e se ninguém levantar, levante você: não demonstramos no módulo 6 que reconhecer aninhamento exige memória ilimitada? Responda pela divisão de trabalho, que é o que torna o resultado inteligível: a memória ilimitada mora na pilha; o autômato guarda apenas em que ponto de que produções estamos, e isso é informação finita porque a gramática tem um número finito de produções de corpo finito. Esse é o momento mais bonito do módulo — não o atropele.
Bloco seguinte — itens, fecho e desvio, construídos com a sala
Trabalhe sobre a gramática de expressões com dois níveis de precedência, escrita com recursão à esquerda e aumentada por S' \to E. Explique o aumento pelo que ele compra: um ponto de aceitação único, sem o qual o analisador não distingue “terminei” de “reduzi ao símbolo inicial no meio do caminho”.
Item é produção com um ponto marcando o quanto dela já está na pilha; estado é conjunto de itens, porque o analisador em geral não sabe em qual produção está e carrega todas as posições plausíveis. Diga que isso é a determinização por subconjuntos outra vez, e que não é coincidência — a turma reconhece a construção do módulo 5 e a economia conceitual fica evidente.
Construa no quadro, com a sala, apenas os quatro primeiros estados, e não mais que isso. O estado I_0 é o fecho de S' \to \cdot\, E e contém sete itens; I_1, alcançado por E, contém S' \to E\,\cdot e E \to E \cdot + T; I_2, alcançado por T, contém E \to T\,\cdot e T \to T \cdot {*} F; I_3, alcançado por F, contém apenas T \to F\,\cdot. Peça que as duplas terminem a coleção e confiram contra os doze estados do material do módulo. Anuncie os dois erros que arruínam a construção à mão antes que eles aconteçam: aplicar o fecho uma vez só, esquecendo que os itens acrescentados também exigem fecho, e não identificar estados repetidos, tratando como novo um conjunto de itens já construído — quem comete o segundo constrói uma árvore infinita em vez de um autômato finito.
Feche apontando para os estados 1 e 2: cada um tem um item completo mandando reduzir e um item pedindo deslocamento. O autômato, sozinho, não decide. É essa a fronteira que divide o módulo em duas metades.
Primeira questão de discussão em duplas. “Durante um reconhecimento ascendente, a pilha contém E + T e a entrada restante começa por *. Isso significa que: (a) há uma alça na pilha e ela deve ser reduzida agora; (b) há uma alça possível na pilha, mas reduzir agora pode estar errado; (c) não há alça na pilha, porque a entrada não acabou; (d) a pilha está em estado inválido, porque E + T não é prefixo viável.”
Aplique o procedimento inteiro: voto individual em silêncio, discussão em duplas, segundo voto. A resposta é (b). Quem vota (a) confunde casar com o corpo de uma produção com ser o momento de reduzir, que é exatamente o problema do módulo. Quem vota (c) supõe que a alça só existe no fim. Quem vota (d) desconfia do conteúdo da pilha e é o erro mais produtivo: aproveite para reafirmar que E + T é prefixo viável legítimo, e que ser viável não implica ser reduzível agora. Não revele a resposta antes da discussão.
Bloco de abertura da segunda aula — retomada pela indecisão pendente
Não recapitule. Escreva no quadro os itens do estado 2 — E \to T\,\cdot e T \to T \cdot {*} F — e pergunte à sala o que falta para decidir. A resposta que você quer ouvir é “o próximo símbolo da entrada”, e ela abre a aula inteira. Quando alguém disser isso, escreva ao lado a regra em uma linha: só reduza por A \to \beta se o próximo símbolo puder legitimamente seguir A.
Bloco seguinte — a tabela e o traçado, com números no quadro
Monte a metade de ação da tabela para os estados que interessam, usando os conjuntos de seguidores \mathrm{SEG}(E) = \{+, ), \$\} e \mathrm{SEG}(T) = \mathrm{SEG}(F) = \{+, *, ), \$\} — os mesmos que a turma calculou no módulo 10, o que vale comentar: mesma ferramenta, reaproveitada por um método que decide de outro jeito.
Olhe a linha 2 com a sala e demore nela, porque contém a decisão inteira. A redução por E \to T aparece em +, ) e $; na coluna * aparece deslocamento, porque * não segue E. Diga a consequência em voz alta: se a redução também estivesse em *, a multiplicação deixaria de agrupar mais forte que a soma. No método ascendente, precedência é propriedade da tabela.
Trace id * id + id por inteiro no quadro, sem pular passos, com pilha e entrada restante em duas colunas. Com id à frente, desloca; com * à frente, reduz por F \to id e depois por T \to F, chegando à pilha T — e aqui está o momento decisivo, que você deve marcar em voz alta: o item completo E \to T\,\cdot está disponível e o analisador não reduz, porque a tabela manda deslocar diante de *. Segue deslocando * e id, reduz por F \to id e por T \to T * F, e só então, com + à frente, reduz por E \to T. Desloca + e id, reduz por F \to id, por T \to F e por E \to E + T, e aceita.
Colha o resultado com a turma: as reduções, na ordem, foram F \to id, T \to F, F \to id, T \to T * F, E \to T, F \to id, T \to F, E \to E + T — oito reduções e cinco deslocamentos, um por terminal da entrada. Leia-as de trás para a frente na frente da sala e mostre a derivação mais à direita regenerando a cadeia. É a segunda vez que o teste aparece na aula e é de propósito.
Registre ainda dois detalhes que geram engano sistemático na tutoria: a redução não consome entrada, de modo que o símbolo de antecipação continua lá e será reexaminado; e o estado consultado para o desvio é o que fica exposto depois do desempilhamento.
Segunda questão de discussão em duplas. “Por que a célula da linha do estado 2 na coluna * traz deslocamento e não redução? (a) porque reduzir e deslocar dão o mesmo resultado e escolheu-se o mais rápido; (b) porque * não pertence ao conjunto de seguidores de E; (c) porque a produção E \to T nunca é usada; (d) porque o estado 2 não tem item completo.”
A resposta é (b). Quem vota (a) não percebeu que a escolha determina a precedência da linguagem — é o erro que mais vale corrigir, e o antídoto é pedir que a dupla desenhe a árvore que sairia da outra escolha. Quem vota (c) está lendo a tabela como se a ausência numa coluna anulasse a produção; mostre que ela aparece em três outras colunas. Quem vota (d) leu o estado errado e se corrige sozinho na discussão.
Bloco seguinte — a escala dos quatro métodos como progressão, não como catálogo
Este é o bloco que degenera em lista se você deixar. A regra de condução é uma só: nenhum nível entra sem que o conflito concreto que ele resolve tenha sido exibido antes.
Comece pelo mais fraco, que decide sem olhar a entrada e reduz sempre que há item completo. Mostre-o quebrando nos estados que a sala construiu — a gramática de expressões, minúscula, já não o satisfaz, e praticamente nenhuma gramática de linguagem de programação satisfaz. O valor dele é conceitual: deixa visível o que falta ao autômato de itens.
O primeiro refinamento é o que a turma já deduziu na abertura da aula, e é o mais barato possível — olhar um símbolo à frente e restringir a redução aos seguidores. Registre o custo histórico, porque situa a família: as tabelas originais de Knuth eram grandes demais para as máquinas da época, e foi a tese de doutorado de Frank DeRemer, no MIT, em 1969, que sistematizou as simplificações que tornaram o método utilizável.
Exiba então a limitação, sem a qual o nível seguinte é gratuito: a aproximação por seguidores é generosa demais, porque pergunta se o símbolo pode seguir a variável em algum lugar da gramática quando a pergunta certa é se ele pode segui-la naquele estado. Use o contraexemplo canônico da gramática de atribuição com indireção, discutida por Aho e outros, em que o lado esquerdo e o lado direito derivam a mesma coisa: o conflito acusado é espúrio, porque ali reduzir nunca é correto. A correção — carregar dentro de cada item o conjunto de símbolos que podem segui-lo naquele contexto — é óbvia e cara, e foi por causa do tamanho que o método canônico ficou quase uma década tido como impraticável.
Feche com a fusão de núcleos, que é o ponto de equilíbrio adotado pelos geradores, e delimite o preço dela com precisão em vez de deixar a impressão de que a fusão é gratuita: fundir estados de mesmo núcleo nunca cria conflito de deslocamento-redução novo, pode criar conflito de redução-redução, e o analisador fundido não aceita cadeias fora da linguagem — apenas adia a detecção do erro. A fusão degrada o diagnóstico, não a correção.
Termine com as duas consequências teóricas, ambas de Knuth, que amarram o módulo à teoria dos módulos 8 e 9: aumentar a antecipação além de um símbolo não amplia a classe de linguagens alcançável, e a família com um símbolo de antecipação caracteriza exatamente as linguagens livres de contexto determinísticas. O método é a realização algorítmica do modelo de pilha determinístico estudado no módulo 9.
Bloco seguinte — conflitos: dois tipos, e duas causas que importam mais
Defina conflito como célula à qual a construção tenta atribuir dois valores, e apresente os dois tipos rapidamente. Depois desloque a atenção para onde ela rende: a distinção que resolve problema não é entre os dois tipos, é entre as duas causas. Quando a gramática não é ambígua, falta informação, e subir de nível resolve. Quando ela é ambígua, falta resposta — existem genuinamente duas árvores, e nenhuma antecipação escolhe entre elas.
Dê o teste prático, que é operacional e a turma leva para a tutoria: tente construir uma cadeia curta com duas árvores; conseguiu, é ambiguidade e nenhum nível resolve; não conseguiu, é aproximação grosseira e subir de nível resolve.
Trate a resolução por declaração de precedência com a franqueza necessária, porque é onde os egressos erram na vida profissional. A convenção vem do gerador que Stephen Johnson escreveu nos laboratórios Bell em meados dos anos 1970 e distribuiu com o Unix, em que os operadores são declarados em ordem crescente de precedência e a não associatividade produz erro. Diga a frase que precisa ficar: declarar precedência não é atalho para entender o conflito, é a mesma decisão tomada em outro lugar. Quem declara sem examinar o estado conflituoso resolve por sorte, e o sintoma clássico é o analisador que passa a compilar sem aviso e aceita programas cuja árvore não corresponde ao que se pretendia — defeito que aparece muitas fases depois, como resultado errado em tempo de execução.
Encerre com o caso do condicional de alternativa opcional, que é o conflito mais conhecido da literatura, e com a ironia que o acompanha: a convenção universal é associar a alternativa ao condicional mais próximo, o que corresponde a deslocar, e deslocar é justamente a resolução padrão dos geradores. O conflito mais famoso do assunto é um que quase todo mundo resolve corretamente sem perceber, ignorando o aviso. Não recomende o hábito, e diga por quê: o aviso ignorado por sorte treina o hábito de ignorar avisos.
Bloco de fechamento — ler um relatório de conflitos, e volta ao gancho
Feche pela habilidade que o módulo existe para formar. Um gerador, ao encontrar conflitos, resolve por regras padrão e avisa; o aviso é uma linha de resumo, e é onde a maioria para de ler. O que interessa está no relatório detalhado, que lista cada estado com seus itens e, nos conflituosos, a ação escolhida e a descartada — o mesmo objeto que a sala construiu à mão no primeiro dia, impresso por um programa.
Dê o procedimento de três passos e insista no terceiro, que é o que quase ninguém faz: localizar o estado citado e ler seus itens; identificar o item completo e o que pede deslocamento, anotando o terminal em disputa; e reconstruir um programa de exemplo que leve o analisador àquele estado, lendo os símbolos à esquerda dos pontos dos itens do núcleo. O terceiro passo converte sintoma em causa. Dê também o critério de verificação: um conflito genuinamente resolvido some do relatório; se o número não caiu, a correção não corrigiu nada.
Volte então à pergunta que ficou no canto do quadro na abertura da primeira aula. Responda-a com os dois cenários na mesa, sem declarar vencedor absoluto: para entender a análise sintática construindo-a, o caminho descendente é superior, porque o código é legível, as mensagens saem boas de graça e nada é delegado a uma ferramenta fechada; para um compilador de produção com gramática que vai evoluir, o ascendente com gerador é superior, pela ausência de transformações e pela verificação automática a cada alteração. E o que não muda entre os dois cenários é a fronteira do que é humano — as decisões de precedência continuam sendo decisões de projeto, e o relatório de conflitos continua exigindo alguém capaz de ler itens e estados.
Termine com a lição transferível, que é o que sobra do módulo daqui a cinco anos: passamos um módulo inteiro eliminando recursão à esquerda como se fosse defeito da gramática, e este descobrindo que era a forma preferida de outro método. Nenhuma das dificuldades era dificuldade do problema; todas eram dificuldade da abordagem escolhida.
Aulas 3 a 6 — Tutoria do Projeto Integrador
Quatro aulas de tutoria — recorte da gramática do grupo, tabela construída à mão, conflitos lidos e classificados, comparação específica e plano do terceiro bloco.
O andaime aqui já é baixo: você fornece o objetivo e o critério de aceitação, não o caminho. Mas há uma exceção que vale impor sem negociar, porque é a diferença entre a entrega útil e a redação de meia página: a tabela vem antes do texto, e você a verifica pessoalmente antes de o grupo escrever uma linha comparativa.
Tenha o seu próprio estudo aberto e projetado nas duas sessões. O grupo que vê os oito estados do recorte de expressões da Peneira tabulados, com itens e desvios em colunas, entende o formato da entrega em um minuto; o grupo que só ouve a descrição da tarefa produz uma folha com produções soltas e nenhuma decisão.
Primeira sessão de tutoria — escolher o recorte e construir o autômato de itens
Comece pela escolha do recorte, que é onde os grupos gastam mal a abertura da sessão. O critério é duplo e precisa ser dito nessas palavras: pequeno o bastante para caber no papel, interessante o bastante para produzir uma decisão de verdade. Circule perguntando a cada grupo onde está o ponto de decisão do recorte escolhido. Quem escolheu a parte declarativa da própria linguagem — sequências fixas de terminais — vai produzir uma fileira de deslocamentos sem nenhum conflito e sem nenhum aprendizado; mande trocar na hora, e sugira a direção certa: a parte da gramática que custou mais caro no módulo 10, que quase sempre é a das expressões, porque é onde as duas famílias divergem.
Projete então o recorte da referência e mostre as duas reduções honestas que fiz nele: colapsei a cadeia de produções encadeadas que só acrescentava estados de redução sem decisão nova, e acrescentei a produção de aumento, que não estava na gramática original. Explique o aumento pelo que ele compra, porque nenhum grupo o inclui espontaneamente e sem ele a tabela não tem célula de aceitação.
A segunda metade da sessão é a construção da coleção de itens, e ela é lápis e papel de verdade. Circule com um critério de verificação na mão, não com conselhos: todo estado alcançado por desvio sobre um símbolo só contém itens em que aquele símbolo precede imediatamente o ponto, ou itens iniciais trazidos pelo fecho. O erro que você vai encontrar em quase todos os grupos é o fecho incompleto no estado alcançado depois de deslocar um operador — o ponto passa a preceder uma variável e as produções dela têm de entrar. Sem elas o estado fica sem desvio pelo identificador, e o autômato resultante funciona apenas para expressões de um operando. Vale anunciar esse erro à sala antes que aconteça, porque encontrá-lo depois custa refazer a tabela inteira.
Segunda sessão de tutoria — tabela, conflitos e o plano do terceiro bloco
Abra cobrando a tabela e verificando duas coisas em cada grupo, sempre nesta ordem. Primeiro, se as reduções estão restritas aos seguidores da variável reduzida; o erro por reflexo é preencher a linha de um estado com item completo reduzindo em todos os terminais, o que é o método fraco disfarçado e reintroduz os conflitos que os seguidores tinham resolvido. Segundo, se há um traçado completo com a verificação pela derivação mais à direita feita e mostrada — as reduções lidas ao contrário regeneram a cadeia, e é o teste mais barato que existe.
Prepare-se para o caso mais comum e desconcertante: o recorte sai sem conflito nenhum. Foi o que aconteceu comigo, e não é um problema, é uma oportunidade — mande o grupo provocar deliberadamente os dois tipos, cada um por uma modificação plausível da própria linguagem, registrada como hipótese e não como parte do projeto. Na referência, o conflito de deslocamento-redução veio de permitir encadeamento de comparação, que o módulo 8 tinha proibido de propósito; e o de redução-redução veio de supor duas categorias sintaticamente indistinguíveis para a mesma forma superficial. Passe também a heurística de diagnóstico, que é o que os grupos levam para a vida: conflito de deslocamento-redução costuma ser questão de poder ou de precedência; conflito de redução-redução costuma ser questão de projeto da gramática.
Só depois de a tabela estar verificada libere a escrita da comparação, e dê o formato: números do próprio projeto, não afirmações genéricas. Projete os meus para servirem de modelo de granularidade — seis transformações no módulo 10, gramática de 22 para 28 produções, cinco variáveis anuláveis introduzidas que não existiam, 49 células na tabela descendente, oito estados no recorte ascendente. E conte a inversão que me surpreendeu: o recorte que escolhi foi justamente aquele cuja transformação foi a mais cara do semestre, e a gramática ascendente o aceita sem transformação alguma. Não é que ela tolere a recursão à esquerda; ela a prefere.
Reserve a última parte da sessão para o plano dos módulos 12 a 15, e conduza-a com uma exigência única: o plano tem de nomear o que uma frente entrega para a outra e em que formato. Plano que só distribui módulos por nome não previne nenhum dos conflitos que deveria prevenir. Force a decisão adiantada sobre o formato do objeto emitido, que pertence formalmente ao módulo 13 e precisa estar acordada antes do 12, porque a tabela de símbolos só sabe o que guardar depois que se sabe o que a geração vai consultar. E desaconselhe a divisão por fase, que é a que parece natural e é a que dá errado neste bloco pelo acoplamento; dividir por caminho de dados funciona melhor, com uma frente cuidando das estruturas que atravessam as três fases e outra das verificações e da emissão.
O que registrar no diário ao fim do módulo
Anote, por grupo, três coisas: se a tabela foi construída antes do texto ou depois, quais conflitos o grupo provocou e como os explicou, e o formato do objeto que o grupo acordou. A terceira é a que se paga em janeiro — no módulo 14, quando o gerador tiver de emitir exatamente aquilo, você vai querer saber o que foi combinado aqui e quem combinou.
Entregáveis e Avaliação
Ao fim do módulo cada grupo entrega um estudo, não um programa, e a estrutura do estudo é fixa: o recorte escolhido da própria gramática com a justificativa da escolha, a coleção de itens e a tabela de análise construídas à mão, os conflitos encontrados com tipo e origem de cada um, a comparação entre as duas famílias aplicada àquele caso, e o plano dos módulos restantes com divisão de trabalho.
Confira as entregas na mesma ordem para todos os grupos, e comece sempre pela tabela. O recorte tem três ou quatro produções e contém um ponto de decisão real, e não uma sequência de terminais que produziria uma fileira de deslocamentos. A coleção de itens tem o fecho aplicado até estabilizar e não tem estados duplicados. As reduções da tabela estão restritas aos seguidores da variável reduzida, e não espalhadas por todos os terminais. Há um traçado completo de pelo menos uma cadeia, com a verificação pela derivação mais à direita feita e mostrada. E o texto comparativo cita números do próprio trabalho do grupo — quantas transformações a gramática precisou no módulo 10, quantas produções foram acrescentadas, quantos estados o recorte produziu.
O critério que separa a entrega boa da entrega genérica é este último, e ele merece ser dito à turma antes da primeira sessão de tutoria: texto comparativo que valeria para qualquer projeto vale zero. É por isso que a tabela vem antes do texto na correção e na tutoria; quem escreve a comparação sem ter construído a tabela produz afirmações intercambiáveis, e a exigência da tabela existe exatamente para impedir isso.
Registre no componente contínuo do módulo a pontualidade da entrega, a contribuição nas duas discussões em duplas das aulas teóricas e o engajamento nas atividades colaborativas da tutoria. Se um grupo pedir para “compensar” a ausência de código com trabalho extra em outro módulo, recuse: a entrega deste módulo mede uma coisa difícil de medir e que nenhum código mediria, que é se o grupo entendeu o método que não implementou.
Orientações Sobre o Aplicativo
Use o aplicativo da disciplina para as duas votações das aulas teóricas, mantendo a projeção anônima. A primeira questão, sobre a alça na pilha, é o termômetro que interessa: se a turma se dividir entre a alternativa correta e a que manda reduzir imediatamente, a inversão do papel da pilha ainda não assentou, e a discussão em duplas resolve. Se convergir para a alternativa que manda reduzir, pare e refaça o traçado espelhado no quadro antes de qualquer discussão — instrução por pares só corrige quando há quem tenha entendido.
Guarde os dois histogramas e compare-os com os do módulo 10. A turma que votou bem lá e vota mal aqui não perdeu conhecimento: está lendo a pilha com a intuição do método anterior, que é o erro previsto e o mais fácil de corrigir se identificado nesta semana em vez de na tutoria.
Acompanhe também o engajamento no estudo do material, que responde por metade do componente contínuo. Este é um módulo em que o número costuma cair, porque não há código para escrever e a turma trata o assunto como opcional. Se a queda aparecer, comente-a explicitamente na abertura da primeira tutoria, ligando-a à entrega: sem o material lido, a tabela não sai, e sem a tabela não há o que comparar.
Pontos de Atenção Específicos
A inversão da pilha é o eixo, e ela se perde em silêncio. O estudante não anuncia que está lendo a pilha ao contrário; ele apenas produz traçados errados que parecem quase certos. Explicite a inversão cedo, com os dois traçados lado a lado sobre a mesma cadeia, e volte a ela toda vez que um traçado sair torto na tutoria.
Não deixe o bloco da escala virar desfile de siglas. O que se espera que fique é a progressão, não as quatro tabelas. Verifique isso no fim da segunda aula com uma pergunta única: qual conflito concreto cada nível resolveu que o anterior não resolvia? Se a turma responder pelos nomes em vez dos conflitos, o bloco não funcionou.
A pergunta “por que estudamos isso se não vamos usar” vai aparecer. Responda uma vez, com o argumento da leitura de relatório e da fronteira do que é humano, e siga. Repetir a justificativa a cada bloco sinaliza insegurança sobre a decisão e convida à negociação de escopo.
O risco da tutoria é o oposto do módulo 9. Lá os grupos travavam por excesso de abstração; aqui eles escorregam para a redação genérica. A trava é procedimental e não retórica: tabela verificada por você antes de o grupo escrever uma linha de texto comparativo.
Cuidado com a digressão sobre ferramentas. Alguém vai perguntar qual gerador usar, e a conversa consome um bloco inteiro se você deixar. Reconduza pela decisão de projeto — a restrição de construir tudo à mão existe para que cada peça seja código que o grupo escreveu e entende — e ofereça o assunto como leitura complementar, não como aula.
Grupos com pendências do módulo 10 vão querer usar a tutoria para saldá-las. Permita, com uma condição explícita e verificada: a tabela deste módulo é entregue de qualquer forma. Este é o último módulo folgado do semestre, e o bloco seguinte tem três fases acopladas; um grupo que chega ao módulo 12 devendo o front-end e sem plano de trabalho não recupera mais.