SubTotal

Propaganda
Substitutiva Total de Construção de Compiladores
Primeiro Semestre de 2001
Prof. José de Oliveira Guimarães
1 (3.0) O comando while de Java tem o seguinte formato:
while (expr)
C;
onde C é um comando.
Para este comando, faça o analisador sintático com a geração da ASA, a classe
da ASA correspondente ao comando while com um método genC para gerar código e o
analisador semântico.
Admita que já existe um método
Statement statement()
que analisa um comando e retorna o objeto da ASA correspondente. Há um método
Expr expr()
que
analisa
uma
expressão.
A
classe
Expr
possui
um
método
”Type getType()” que retorna o tipo da expressão. A classe Type é superclasse de todos
os tipos e possui um método “String getName()” para retornar o nome do tipo.
O analisador deve estar dentro de uma classe. Assuma que o analisador léxico
esteja dentro desta classe também, como um método. Este método coloca o token
encontrado na análise léxica na variável de instância token da classe que você fazer.
Tudo igual aos exemplos que vimos. Não é necessário declarar as constantes
correspondentes aos terminais.
Acrescente, às classes da ASA que você fizer, métodos genC que devem gerar
código em C. Assuma que as classes da ASA que você utilizar, como Statement, já
possuam este método.
Faça a análise semântica junto com a análise sintática. Há apenas uma
conferência semântica a ser feita.
2. (1.0) Qual é a função da tabela de símbolos ? Para auxiliar a sua resposta, siga as
seguintes dicas: explique a sua utilidade, diga quando um elemento é inserido na TS,
quando elementos são retirados da TS e mostre um e apenas um exemplo de sua
utilização,.
3. (1.5) Faça um código em Java que monta a ASA para a seguinte expressão
(* (comb 4 1) x)
Estamos utilizando a gramática do segundo trabalho. Assim, “(comb 4 1)” é a chamada de
uma função chamada “comb” com parâmetros 4 e 1. O resultado disto é multiplicado pelo
parâmetro “x”.
Não é preciso fazer as classes da ASA que você utilizar, apenas as utilize.
Desenhe o objeto criado usando bolinhas para representar objetos e setas para
representar ponteiros (como feito inúmeras vezes em sala de aula).
4. (1.5 = 0.5 + 1.0)
a) (0.5) Faça uma gramática com operadores binários + e * de tal forma que:
 + seja associado à direita e tenha maior precedência do que *
 * seja associado à esquerda
 N seja um terminal representando números.
b) (1.5) Explique porque, na sua gramática, + tem maior precedência do que * e porque +
é associado à direita.
5. (1.5) Pode ser provado que se uma gramática G é LL(1), então se A ::=  |  forem
duas produções distintas de G e  puder levar a vazio, então  não derivará qualquer
forma sentencial começando com um terminal que pertence a follow(A).
Explique porque esta regra é necessária para que G não seja ambígua. Para
auxiliá-lo na resposta, encontre uma sentença que possua duas derivações à esquerda
diferentes se esta regra for violada.
6. (1.5) Na análise sintática descendente não recursiva, é utilizada uma tabela M cujas
entradas são números das produções da gramática. Por exemplo, M[ E, id ] pode ser 1
significando que, ao expandir E e o token corrente for id, deve-se expandir E utilizando a
regra 1 da gramática. Diga qual a relação entre id e  considerando que a regra 1 é E ::=
. Utilize follow, first e o que mais for necessário. Explique qual a razão de se utilizar a
regra 1 para expandir E neste caso e não outra regra para E, como E ::= .
Download