Dado o seguinte trecho de código na linguagem de programação Python: if (x > 0) then y = x + 1; else y = x - 1; Suponha que você está construindo um analisador sintático descendente LL(1) para essa linguagem. Qual é o próximo passo de análise após reconhecer a produção if (x > 0) then?
Questão
Dado o seguinte trecho de código na linguagem de programação Python:
if (x > 0) then y = x + 1; else y = x - 1;
Suponha que você está construindo um analisador sintático descendente LL(1) para essa linguagem. Qual é o próximo passo de análise após reconhecer a produção if (x > 0) then?
Alternativas
a) Realizar uma redução da produção stmt para else_stmt.
b) Realizar uma redução da produção if_stmt para stmt.
c) Procurar por um token de lookahead correspondente a else.
d) Procurar por um token de lookahead correspondente a uma instrução dentro do bloco then.
e) Realizar uma redução da produção stmt para if_stmt.
Explicação
Em um analisador descendente preditivo LL(1), após reconhecer o prefixo de uma produção, o parser não faz reduções (isso é típico de parsers ascendentes como LR). Em LL(1), o próximo passo é expandir a derivação conforme a gramática e consumir a entrada, usando 1 token de lookahead para decidir qual produção aplicar.
Uma forma comum de gramática para esse tipo de comando é:
Depois que o analisador já reconheceu if (x > 0) then, ele ainda não terminou o : pela produção, o próximo símbolo esperado é um stmt (a instrução do bloco then). Portanto, o próximo passo é olhar o próximo token da entrada para prever/selecionar qual alternativa de deve ser usada (por exemplo, início de atribuição, outro if, etc.).
Só depois de reconhecer esse stmt do then é que faria sentido olhar adiante para decidir se existe um else (isto é, ao entrar em ).
Alternativa correta: (d).