Escolar Documentos
Profissional Documentos
Cultura Documentos
Linguagem de Programação
(a) A = A * (B + (C * A))
(b) B = C * (A * C + B)
(c) A = A * (B + (C))
(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 *.
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.
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.
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:
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.
(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
1. Descreva uma situação na qual uma variável sensı́vel ao histórico em um subpragrama é útil.
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
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.