Autor
Afiliações

Moacyr Francischetti Corrêa, Bacharel em Ciência da Computação, Licenciado em Computação, Especialista em Ciência de Dados e Inteligência Artificial, PhD em Biotecnologia in Silico

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.

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
Figura 1: O módulo 11 entre o marco do analisador descendente e o bloco final de semântica, geração e otimização.

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 — 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.