Você está na página 1de 3

Lista 1

Linguagem de Programação

Capı́tulo 1 - Aspectos Preliminares

1. Cite um exemplo de falta de ortogonalidade no projeto da linguagem C.

2. Cite um exemplo de falta de simplicidade geral no projeto da linguagem C.

3. Cite um exemplo de pouca confiabilidade no projeto da linguagem C.

Capı́tulo 3 - Descrevendo Sintaxe e Semântica

1. Considere a seguinte gramática para sentenças de atribuição simples:


<assign> → <id> = <expr>
<id> → A|B|C
<expr> → <id> + <expr>
| <id> * <expr>
| (<expr>)
| <id>
Mostre uma árvore de análise sintática e uma derivação mais a esquerda para cada uma das seguintes sentenças:

(a) A = A * (B + (C * A))
(b) B = C * (A * C + B)
(c) A = A * (B + (C))

2. Considere a seguinte gramática não ambı́gua para expressões:


<assign> → <id> = <expr>
<id> → A|B|C
<expr> → <expr> + <termo> | <termo>
<termo> → <termo> + <fator> | <fator>
<fator> → (<expr>) | <id>
Mostre uma árvore de análise sintática e uma derivação mais a esquerda para cada uma das seguintes sentenças:

(a) A = B + C + A
(b) A = A * (B + C)
(c) A = B * (C * (A + B))

3. Reescreva a BNF do Problema 2 para dar ao operador + precedência sobre * e para forçar + a ser associativo à direita.

4. Modifique a gramática do Problema 2 para adicionar um operador unário de subtração que tenha precedência mais alta que + ou *.

5. Considere a seguinte gramática:


S → aS | aSbS | 
Essa gramática é ambı́gua. Mostre, em particular, que o string aab tem duas árvores de análise sintática.

6. Considere a seguinte gramática:


S → SS | a | b

(a) Mostre 3 strings que fazem parte da linguagem definida por S.


(b) Mostre que essa gramática é ambı́gua.

7. Prove que a seguinte gramática é ambı́gua:


S → A
A → A+A|I
I → a|b|c

8. Escreva uma gramática para a linguagem com cadeias que têm n cópias da letra a seguida pelo mesmo número de cópias da letra b, onde
n > 0. Por exemplo, as cadeias ab, aaaabbbb, e aaaaaaaabbbbbbbb estão na linguagem, mas a, abb, ba, e aaabb não estão.

9. Escreva árvores de análise sintática para as sentenças aabb e aaaabbbb, derivadas da gramática do problema anterior.

10. A gramática a seguir gera expressões de prefixo com operandos x e y e operadores binários +, - e *:
E → +EE | -EE | * EE | x | y
Encontre uma árvore de derivação para a string + − ∗ − xyxy.

11. Converta a seguinte EBNF para BNF:


S → A {bA}
A → a [b]A

Capı́tulo 4 - Análise Léxica e Sintática

1
1. Considere as seguintes afirmativas:
I. A análise léxica é geralmente implementada como uma subrotina do parser, ou seja, é chamada pelo parser. A análise léxica reconhece
sı́mbolos léxicos (tokens) e encontra erros como esquecer o ponto-e-vı́rgula depois de um comando Java.
II. Os parsers descendentes recursivos são parsers fáceis de implementar para linguagens cuidadosamente projetadas, porém geralmente
exigem transformações em gramáticas originalmente apresentadas em BNF, como por exemplo, eliminação de recursão à esquerda.
III. A análise léxica é usualmente implementada usando um autômato regular.
IV. Parênteses desbalanceados são um erro geralmente detectado pela análise léxica, já que essa fase lê o arquivo fonte e o traduz para uma
sequência de sı́mbolos léxicos, ou tokens.
Indique e corrija as afirmativas falsas.

2. Quais são os motivos para separar a análise léxica da sintática.

3. Considere o alfabeto simples composto por somente três caracteres alfabéticos, Σ = {a, b, c}. Gere a expressão regular para as seguintes
cadeias abaixo:

(a) O conjunto de todas as cadeias de caracteres que contêm no máximo um b.


(b) O conjunto de todas as cadeias de caracteres começadas por a ou b e terminadas com o caractere c.

4. Faça um autômato regular que reconheça a mesma linguagem das expressões regulares acima.

5. Seja o alfabeto Σ = {a, b} e a linguagem regular L. L é formada por todos os strings ω formados por a’s e b’s e o número de a’s em ω é
par Qual das expressões regulares abaixo gera essa linguagem?

(a) (a b* a b*)*
(b) ( ( a a )* | b* )*
(c) ( b* | ( a a )* | b* )*
(d) ( b* a b* a b* )*
(e) ( a a | b )*

6. Explique por que os compiladores usam algoritmos de análise sintática que funcionam em apenas um subconjunto de todas as gramáticas.

7. Explique as duas caracterı́sticas das gramáticas que as proı́bem de serem usadas como a base para um analisador sintático descendente.

8. Faça o teste de disjunção par a par para as seguintes regras gramaticais.

(a) A → aB | b | cBB
(b) B → aB | bA | aBb
(c) C → aaA | b | caB

9. Mostre a saı́da do analisador sintático descendente recursivo dado na Seção 4.4.1 para as seguintes cadeias:

(a) a + b * c
(b) a * (b + c)

10. Mostre uma análise sintática completa, incluindo o conteúdo da pilha de análise sintática, a cadeia de entrada e ações usando a gramática
e a tabela de análise sintática da seção 4.5.3 para as seguintes cadeias de entrada

(a) id * (id + id)


(b) (id + id) * id

Capı́tulo 5 - Nomes, Vinculações e Escopos

1. Descreva uma situação na qual uma variável sensı́vel ao histórico em um subpragrama é útil.

2. Quais são as vantagens e desvantagens de declarações de tipo implı́citas?

3. Quais são as vantagens e desvantagens da vinculação de tipos dinâmica?

4. Defina variáveis estáticas, dinâmicas da pilha, dinâmicas do monte explı́citas e dinâmicas do monte implı́citas.

5. Assuma que o seguinte programa Ada foi compilado e executado usando regras de escopo estático. Que valor de X é impresso no
procedimento Sub1? Sob re- gras de escopo dinâmico, qual o valor de X impresso no procedimento Sub1?

1 procedure Main i s
2 X : Integer ;
3 procedure Sub1 i s
4 b e g in −− de Sub1
5 Put (X) ;
6 end ; −− de Sub1
7 procedure Sub2 i s
8 X : Integer ;
9 b e g in −− de Sub2
10 X := 10;
11 Sub1
12 end ; −− de Sub2
13 b e g in −− de Main
14 X := 5 ;
15 Sub2
16 end ; −− de Main

6. Considere o programa:

2
1 procedure Main i s
2 X, Y, Z : Integer ;
3
4 procedure Sub1 i s
5 A, Y, Z : Integer ;
6 procedure Sub2 i s
7 A, B, Z : Integer ;
8 b e g in −− de Sub2
9 ...
10 end ; −− de Sub2
11 b e gi n −− de Sub1
12 ...
13 end ; −− de Sub1
14
15 procedure Sub3 i s
16 A, X, W : Integer ;
17 b e gi n −− de Sub3
18 ...
19 end ; −− de Sub3
20
21 b e g in −− de Main
22 ...
23 end ; −− de Main

Liste todas as variáveis, com as unidades de programa onde elas estão declaradas, visı́veis nos corpos de Sub1, Sub2 e Sub3, assumindo que
o escopo estático esteja sendo usado

7. Considere o seguinte esqueleto de programa em C:

1 v o i d fun1 ( v o i d ) ; /∗ p r o t ó t i p o ∗/
2 v o i d fun2 ( v o i d ) ; /∗ p r o t ó t i p o ∗/
3 v o i d fun3 ( v o i d ) ; /∗ p r o t ó t i p o ∗/
4 v o i d main ( ) {
5 int a , b , c ;
6 ...
7 }
8 v o i d fun1 ( v o i d ) {
9 int b , c , d;
10 ...
11 }
12 v o i d fun2 ( v o i d ) {
13 int c , d, e;
14 ...
15 }
16 v o i d fun3 ( v o i d ) {
17 int d, e , f ;
18 ...
19 }

Dada as seguintes sequências de chamadas e assumindo que o escopo dinâmico é usado, que variáveis são visı́veis durante a execução da
última função chamada? Inclua com cada variável visı́vel o nome da função na qual ela foi definida.

(a) main chama fun1; fun1 chama fun2; fun2 chama fun3.
(b) main chama fun1; fun1 chama fun3.
(c) main chama fun2; fun2 chama fun3; fun3 chama fun1.

Você também pode gostar