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 ::= .