Documente Academic
Documente Profesional
Documente Cultură
ndice
Introduo....................................................................................................................................1
Conceitos Bsicos........................................................................................................................1
Gramtica ....................................................................................................................................4
Conceitos Auxiliares....................................................................................................................6
Forma Normal de Backus (BNF).................................................................................................7
Tipos de Gramtica......................................................................................................................8
Hierarquia de Chomsky ...............................................................................................................9
rvores de Derivao para GLC ...............................................................................................13
Relaes teis ...........................................................................................................................18
Gramtica Reduzida ..................................................................................................................19
Conceitos ...................................................................................................................................20
Autmatos .................................................................................................................................23
Anlise Lexical..................................................................................................... 52
4.1
4.2
4.3
4.4
4.5
Tabela de Smbolos.............................................................................................. 62
5.1
5.2
5.3
5.4
5.5
1 Conceitos Formais
1.1 Introduo
Como resultado de pesquisas em mais de 40 anos, as linguagens de programao tm
avanado constantemente, o que tem gerado boas perspectivas aos programadores. Seja com
as tcnicas tais como a programao estruturada, orientada a objetos, ou mesmo com a
utilizao de ferramentas CASE (Computer-Aided Software Engineering).
Nestes anos, a grande dificuldade concentra na polarizao entre padronizar ou no
as linguagens de programao. A no padronizao permite a incorporao de novas
tendncias, tais como as linguagens paralelas. Ambientes de programao (Ex. Turbo
Pascal) acrescentam um grande nmero de novas junes, fazendo com isso que cada
verso fornea novas possibilidades aos programadores. Porm, isso torna o cdigo cada
vez mais dependente da plataforma onde ele executado.
O propsito bsico das linguagens de programao gerar instrues para o
computador executar o processamento propriamente dito. Existe a necessidade de facilitar a
comunicao entre o homem e a mquina visto que os computadores operam num nvel
atmico) em linguagem de mquina (dgitos binrios, registradores, posies de memria,
endereo etc.), enquanto as pessoas preferem expressar-se usando linguagens naturais, mais
prximas da nossa.
Atravs das linguagens de programao, consegue-se :
Cadeia 2 =
Cadeia 3 =
V+ =
5) Concatenao de cadeias
Seja s = a1 a2 ... an
t = b1 b2 ... bn
(ai, bi V)
Exerccio
Seja {a,b,c}
|aaa| =
|aabbb|c =
|| =
|aab|b =
|ccc| =
|cccd|c =
V2 =
V1 =
V3 =
b) V = {x, y, z}
V2 =
9) Linguagem
Uma linguagem sobre V (ou simplesmente linguagem) um subconjunto de V*
Ex. Seja V = {a, b}. As quinze palavras mais curtas de V* so :
{, a, b, aa, ab, ba, bb, aaa, bbb, aab, bba, aba, bab, abb, baa}
L = {s V* / 0 |s| 3}
L = {s V* / s=anb, n 0} = {b, ab, aab, aaab, ... }
Exerccio
Seja V = {+} , z = +
Escreva as cadeias abaixo indicando o tamanho de cada uma delas
z=
z5 =
zz =
z0 =
z2 =
Escrever V* e V+
1.3 Gramtica
Dispositivo de gerao de sentenas que formam as linguagens.
Uma gramtica G = (Vn , Vt , P, S), onde :
Vn : Alfabeto finito conhecido como vocabulrio no terminal que usado pela
gramtica para definir construes auxiliares ou intermedirias na formao de sentenas.
Ex. bloco de comandos
Os smbolos de Vn so usados como nomes para categorias sintticas (verbo - Lngua
Portuguesa).
Representao usual : Elementos de Vn em letras maisculas.
Vt : Alfabeto terminal, que so os smbolos dos quais as sentenas da linguagem so
constitudas.
Os smbolos de Vt so aqueles que aparecem em programas (letras, dgitos, palavras
reservadas etc.).
Representao usual : Elementos de Vt em letras minsculas (incio, fim etc.).
Vt Vn = V
Vt Vn = vazio ()
a) V =
b) V* =
c) 1110 L(G) ?
ii) a b b c L(G) ?
P : SENTENA SN SV
SN ARTIGO SUBSTANTIVO
SV VERBO COMPLEMENTO
COMPLEMENTO ARTIGO SUBSTANTIVO | SUBSTANTIVO
ARTIGO o
SUBSTANTIVO aluno | compiladores
VERBO estudou
Derivar : o aluno estudou compiladores
.
*
L(G) = { w/w V* e S w }
9) Duas gramticas G1 e G2 so equivalentes see L(G1) = L(G2), ou seja, see suas
linguagens so iguais.
Ex. Quais as linguagens geradas para as seguintes gramticas:
G1= ({S}, {a,b}, P, S)
P:
S aSb
S ab
S ab (menor cadeia)
S aSb aabb
S aSb aaSbb aaabbb
G2 = ({S}, {a,b}, P, S)
P:
S aAb
A ab||S
Sx
SM
M MN
Ny
M xy
BNF
G = ({<S>, <M>, <N>}, {x,y}, P, <S>)
<S> ::= x | <M>
<M> ::= <M> <N> | xy
<N> ::= y
Exerccio
Escreva a gramtica para a seguinte linguagem.
L(G) = {w/w {00, 11}* e w = (0011)n , n 0}
tipo 1
AC A no tipo 1
A BC | a
Bb
Cc
L(G) = {a, b, c}
S aS
S bA
Ac
Lista de Exerccios n 1
1) Representar a gramtica do exemplo de um sub-conjunto da lngua Portuguesa em BNF.
2) Escreva duas gramticas equivalentes cuja linguagem seja :
L(G) = {w/w {a, b}* e w = am bn , m 0 n 1}
3) Escreva uma gramtica para cada uma das linguagens abaixo :
a) L(G1 ) = {w/w {a, b, c}* e w = a bn c, n 0}
b) L(G2 ) = {w/w {0, 1}* e w = 0m 1n, m n 1}
4) Seja a gramtica abaixo :
<S> o smbolo inicial
<S> ::= <B>
<B> ::= <C> | <C> + <D>
<C> ::= <D> | <C> * <D> | *<D>
<D> ::= x | (<S>) | - <D>
a) Definir Vt e Vn
b) Gere 10 sentenas para esta gramtica.
5)
P
S aSBC | aBC
CB BC
aB ab
bB bb
bC bc
cC cc
Qual a L(G) ?
G = ({S,B,C},{a,b,c},P,S)
Lista de Exerccios n 2
1) Indique qual o tipo das seguintes gramticas :
a) G = ({M,N,O,P}, {x,y,z,w}, P, O)
P:
P OP
P zzz
O PNMx
O zw
Nz
Mz
P:
P OzP
PO
O PNMx
OzO zw
NM z
P:
c) G = ({M,N,O,P}, {x,y,z,w}, P, O)
P OP | y0
O PNMx | x
OyO zwxyO
NM zM
b) G = ({M,N,O,P}, {x,z,w}, P, O)
d) G = ({M,N,O,P}, {x,y,z,w}, P, O)
O Mx | Nw
Nz
My
P:
P:
c)
P:
SA
A A0
A 1A
A0 10
S S0
S A1
A 0A0
A1
b)
P:
S 1S
S 1A
A 0A
A0
P:
S AB
A aA
A aBB
B Bb
Bb
rvore 2
E
E *
( E )
A mesma que 1
E + E
a
Definio : Dada uma gramtica G = (Vn , Vt , P, S) ela dita ambgua see existir uma
cadeia x L(G) para a qual podem ser construdas duas rvores de derivao diferentes.
Seja a cadeia a+b*a
1) E E*E E+E*E a+E*E a+b*E a+b*a
E
E *
E + E
a
a
b
E * E
b
Tem-se portanto diferentes rvores para a mesma sentena. Isso decorre da ambiguidade da
gramtica. A gramtica ambgua porque no tem precedncia de operadores.
Gramtica acima convertida para no ambgua (foi inserida a precedncia na derivao dos
operadores (* e +)).
P:
EE*T|T
TT+F|F
F a | b | (E)
Definio : Toda sentena de uma gramtica G tem pelo menos uma derivao esquerda e
pelo menos uma direita.
Para formas sentenciais, isto no necessariamente verdadeiro.
Ex. (E + b) * E
Definio : Uma gramtica G no ambgua see toda sentena de G tem uma nica
derivao direita e uma nica esquerda.
Ex. a + b * a
Exerccios Resolvidos:
1) Dizer se so ambguas as gramticas, bem como qual a linguagem gerada.
a) S aSaS |
S aSaS aa
S aSaS aaSaSaS aaaa
S aSaS aaSaSaS aaaSaSaSaS aaaaaa
L(G) = {w/w {a}* e w = (aa)n , n 0}
S
AMBGUA
a S
a S
a S
a S
a S
a S
b) S aSa |
S aSa aa
S aSa aaSaa aaaa
S aSa aaSaa aaaSaaa aaaaaa
L(G) = {w/w {a}* e w = (aa)n , n 0}
S
a S a
a S a
a S a
NO AMBGUA
B
S
A
B
b c b
a) Qual a cadeia representada pela rvore ?
b) Vn = ? Vt = ?
c) bcbbcbb L(G) ?
d) Quais produes (regra de derivaes) pertencem a P ?
e) escreva uma derivao cannica para a rvore
f) No item e quais as sentenas e formas sentenciais ?
a) cbbbbcb
b) Vn = {S,A,B} Vt = {c,b}
c) S AB BSB bSB bcbB bcbbA bcbbSS bcbbcbS bcbbcbb
d) S AB | cb | b
A SS | BS
B b | bA
e) S AB SSB bSB bbB bbb
f) formas sentenciais {AB,SSB,bSB,bbB,bbb} / sentena {bbb}
{x / A x }
Supondo que a gramtica G no contm produes da forma B e considerando a
relao p (primeiro smbolo sobre V) definido por :
Ap x see A x
Em outras palavras, a relao p indica todos os smbolos que aparecem no incio de
alguma cadeia derivvel diretamente de A.
(vrias derivaes)
+
fcil ver que o conjunto desejado dado por {x / Ap x}
S AB
Sa/b
Ac
Bd
p = {A,a,b}
p+ = {A,a,b,c}
EE+T/T
TT*F/F
F a / b / (E)
P:
p
p
E
T
F
a
b
(
)
+
*
E
V
T
V
V
F
V
T
V
V
F
V
V
a
V
V
V
b
V
V
V
(
V
V
V
p+
p+
E
T
F
a
b
(
)
+
*
E
V
A A
2) Todo smbolo da gramtica deve ser til, isto , deve aparecer em alguma forma
sentencial e se for no terminal deve ser possvel derivar dele uma cadeia terminal.
*
1.11 Conceitos
EXPRESSES REGULARES
Definio :
a) Um smbolo terminal qualquer uma expresso regular;
b) Se x e y so expresses regulares, a sua concatenao xy uma expresso regular;
c) Se x e y so expresses regulares, a sua unio x + y uma expresso regular;
d) O smbolo uma expresso regular.
e) Se x uma expresso regular, (x) influencia na ordem de avaliao da expresso.
Ex. ri = r . r . r . r ...(i vezes) uma expresso regular.
x* = {, x, xx, xxx, ...}
(01)* = {, 01, 0101, 010101, ...}
abc*d = {abd, abcd, abccd, ...}
(a + b)* = {, a, b, ab, aa, bb, aab, ...}
L(G) = {0n1, n 0} = {1, 01, 001, 0001, ...} = 0*1
L(G) = {0n1, n 1} = {01, 001, 0001, ...} = 00*1 = 0+1
(0 + 1)* 00 (0 + 1)* = {00, 100, 000, 1000, ...}
1) (1 + 10)* = {, 1, 10, 110, 1010, ...}
Cadeia vazia ou no contendo 0s e 1s, com o nmero de 1s maior ou igual ao nmero de 0s.
2) (0* 1* 2*) = {, 0, 1, 2, 01, 02, 12, 00, 11, 22, 012, ...}
Cadeia vazia ou no contendo 0s, 1s e 2s, em qualquer quantidade respeitando essa ordem.
3) (0+ 1+ 2+) = {012, 0112, 0012, 0122, 001122, ...}
Cadeia contendo 0s, 1s e 2s, sendo que contm pelo menos um elemento de qualquer um,
em qualquer quantidade, respeitando essa ordem.
RECURSIVIDADE DE PRODUO
Definio : N N| logo N *|
onde : e (Vn Vt)*
N Vn
Ex. S aS | b
FATORAO
N | = (|)
Ex. E T | +T | -T | E + T | E - T
E + T | E - T = {+T|-T}*
T | +T | -T = (|+|-)T = [+|-]T
=> [+|-]T{+T|-T}*
Cadeia Opcional []: indica que opcional (pode ocorrer ou no).
OCORRNCIAS ADJACENTES
{, , ...} {||}*
GRAFO SINTTICO
Expresses regulares
Grafo
N ( No terminal)
T (terminal)
1 | 2 | n
1
2
n
*
[]
n
n
{||}*
abnc, n 1
identificador
bloco
declarao de vars
tipo
comando
;
fim
1.12 Autmatos
Um autmato uma mquina que possui um dispositivo de leitura e vrios estados,
sendo que seu estado pode variar de acordo com o que for lido pelo dispositivo de leitura.
Existem diversas formas de representar os autmatos, porm trs formas se destacam
e sero usadas.
a) Diagrama de estado
b) Tabelas de transio
c) Regras de transio
Diagrama de estado
Estado inicial : a partir de onde se iniciam os reconhecimentos da
cadeia.
Estado : qualquer estado que faa parte do autmato (exceto o inicial e final).
Estado final : qualquer sentena da linguagem de aceitao representada pelo
autmato leva a um destes estados aps seu reconhecimento.
transio : arco que representa a mudana de um estado para outro dentro do
autmato.
Exemplo :
a
b
Exerccio :
1) w = anbm , n 1 , m 1}
1
a
b
b
3
2) (a b)m m 1
a
1
b
2
3
a
Smbolo de Entrada
a
b
a
b
a
b
Estado Posterior
2
erro
2
3
erro
3
Regra de Transio
g(1,a) = 2
g(2,a) = 2
g(2,b) = 3
g(3,b) = 3
Tabela de Transio (do exerccio 3)
Estado Anterior
1
1
2
2
3
3
Smbolo de Entrada
a
b
a
b
a
b
Regra de Transio
g(1,a) = 2
g(2,b) = 3
g(3,a) = 2
Fazer para o exerccio 1.
Exerccio Resolvido
Para o autmato a seguir :
a
b
b
c
c
C
a
a) Monte a tabela de transio correspondente.
b) Monte as regras de transio correspondente.
Estado Posterior
2
erro
erro
3
2
erro
c) Escreva 5 sentenas.
d) aabaaac aceita pelo autmato ?
a) Tabela de Transio
Estado Anterior
A
A
A
B
B
B
C
C
C
Smbolo de Entrada
a
b
c
a
b
c
a
b
c
Estado Posterior
A
B
erro
A
B
C
erro
erro
C
Regra de Transio
g(A,a) = A
g(A,b) = B
g(B,a) = A
g(B,b) = B
g(B,c) = C
g(C,c) = C
c) bc, bbc, abc, aabbc, abaabc
d) No porque sempre depois de um a, necessariamente precisa ter um b.
A verificao (reconhecimento) de cadeias utilizando autmatos consiste em partir de
um estado inicial, ler smbolos sequenciais, efetuando uma transio para cada smbolo lido.
Dizemos que uma cadeia de n smbolos K= K1K2K3 ... Kn , N 0 aceito, ou
reconhecido, por um autmato finito (AF) quando partindo-se do estado inicial desse AF,
forem lidos todos os smbolos de K e efetuadas as correspondentes transies de modo que
ao se ler Kn o AF para no estado final.
Exerccios Resolvidos
1) Dado
0
S0
1
1
S1
0
a) L(G) ? Cadeia no vazia terminado com 1
b) 00111 aceito ? Sim
00110 aceito ? No
a
S0
b
S1
a
Cadeias com bs e as e qq ordem
com n de as par
, b, baa, babba, babaaba
Definio Formal
AF uma quintupla ordenada = (S,so,F,A,g), onde:
S: conjunto de estados de um autmato
so: estado inicial, so S
F: conjunto de estados finais, F c S.
A: alfabeto de entrada
g: SxAS: aplicao da transio
Definir formalmente o autmato:
0
S0
1
1
S1
AF = ({S0,S1},S0,{S1},{0,1},g)
S : S0,S1
So : S0
F : S1
A : 0,1
g : g(S0,0) = S0
g(S0,1) = S1
g(S1,1) = S1
EXERCCIOS
1) Usando a seguinte gramtica responda :`
G=({E, V, N, O, T, D, L}, {0, 1, 2, 3, ...9, a, b, c, ...z, +, -, /, *, div, mod}, P, E)
P:
E V / N / VOE / NOE
V L / LT
N D / DN
T L / D / LT / DT
D 0 / 1 / 2 / ... / 9
L a / b / c / ... / z
O + / - / / / * / div / mod
a) G ambgua ?
b) Mostre a cadeia de derivao para a cadeia a + 1 div 4
c) Mostre as derivaes esquerda e direita para a cadeia do item b
d) A cadeia 0 a mod b aceita ?
e) No caso de G ser ambgua verifique, se possvel apresentar uma gramtica G1
equivalente a G que no seja ambgua
2) Para a rvore de derivao a seguir responda :
S
a
A
c
B
S
e S
a B A
d
a B A
d
cada passagem. Como exemplo tem-se que na primeira passagem seria feita a anlise
Lexical, na segunda a sinttica e assim por diante.
Embora existam diferentes notaes para se especificar uma linguagem, a Forma
Normal de Backus (BNF), tem se destacado devido a sua grande facilidade de compreenso.
A BNF uma metalinguagem, ou seja, uma linguagem usada para especificar outras
linguagens. A formalizao da sintaxe da linguagem feita atravs da especificao das
regras de produo, ou regras de substituio, onde cada smbolo da metalinguagem
associada uma ou mais cadeias de smbolos, indicando as diversas possibilidades de
substituio.
COMANDOS
<comandos>::= inicio
<comando>{;<comando>}[;]
fim
<comando>::= (<atribuio_chprocedimento>|
<comando condicional> |
<comando enquanto> |
<comando leitura> |
<comando escrita> |
<comandos>)
<atribuio_chprocedimento>::= (<comando atribuicao>|
<chamada de procedimento>)
<comando atribuicao>::= <identificador> := <expresso>
<chamada de procedimento>::= <identificador>
<comando condicional>::= se <expresso>
entao <comando>
[senao <comando>]
<comando enquanto> ::= enquanto <expresso> faca <comando>
<comando leitura> ::= leia ( <identificador> )
<comando escrita> ::= escreva ( <identificador> )
EXPRESSES
<expresso>::= <expresso simples> [<operador relacional><expresso simples>]
<operador relacional>::= (!= | = | < | <= | > | >=)
<expresso simples> ::= [ + | - ] <termo> {( + | - | ou) <termo> }
<termo>::= <fator> {(* | div | e) <fator>}
<fator> ::= (<varivel> |
<nmero> |
<chamada de funo> |
(<expresso>) | verdadeiro | falso |
nao <fator>)
<varivel> ::= <identificador>
<chamada de funo> ::= <identificador >
NMEROS E IDENTIFICADORES
<identificador> ::= <letra> {<letra> | <dgito> | _ }
<nmero> ::= <dgito> {<dgito>}
<dgito> ::= (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)
<letra> ::= (a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|
A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z)
COMENTRIOS
Uma vez que os comentrios servem apenas como documentao do cdigo fonte, ao
realizar a compilao deste cdigo faz-se necessrio eliminar todo o contedo entre seus
delimitadores.
delimitadores :
{ }
Exerccios
1) Criar o diagrama sinttico para a linguagem definida.
2) Represente a rvore de derivao para o seguinte programa
programa test;
var v: inteiro;
i,max, juro,: inteiro;
incio
enquanto v != -1
faca
incio
{leia o valor inicial}
leia(v);
{leia a taxa de juros }
leia(juro);
{ Leia o periodo };
leia(max);
valor:= 1;
i:= 1;
enquanto i <= max
{ (1+juro) elevado a n }
faca incio
valor:= valor*(1+juro);
i:= i+1
fim;
escreva(valor)
fim
fim.
A Linguagem LPD
Por ser bem prxima da linguagem PASCAL, a linguagem LPD possui muitas de
suas caractersticas:
um a linguagem altamente estruturada.
Necessidades rigorosas na definio de variveis e procedimentos. Voc deve
definir todas as variveis, procedimentos, e funes, antes de us-las.
Funes e procedimentos. Estas so estruturas auto-delimitadas, nas quais voc pode
organizar cada uma das diferentes sees do seu programa.
Variveis locais e globais. Voc pode declarar e usar variveis locais em qualquer
procedimento ou funo. Os valores de dados de variveis locais permanecem privados
para as rotinas que os usem. Voc pode tambm declarar variveis globais que
podem ser usadas em qualquer parte do programa.
Decises SE estruturadas. Elas permitem que voc construa complexas tomadas de
decises.
"Loop" estruturado. LPD fornece "loop" estruturado, no qual voc pode especificar a
condio sob a qual o "loop" dever continuar (ENQUANTO).
2.2.2
Palavras Reservadas
2.2.4
INCIO
FIM
NAO
ENTAO
BOOLEANO
FALSO
OU
VERDADEIRO
DIV
FUNCAO
PROCEDIMENTO
VAR
exemplo,
chamadas
dentro da
listadas na
FACA
SE
PROGRAMA
ENQUANTO
Declaraes VAR
Alternativamente, voc poder usar o formato a seguir para declarar vrias variveis do
mesmo tipo:
.
.
var
NomedaVarivel1,
NomedaVarivel2,
NomedaVarivel3 : Tipo;
.
.
Por exemplo, a seo a seguir declara uma varivel do tipo inteiro e trs
variveis do tipo booleano.
.
var
Codigo_Erro : inteiro;
Sair,
ExisteLista,
Troca_Dados : booleano;
.
2.2.6 Introduo aos Tipos de Dados
Os programas em LPD podem trabalhar com dados expressos como valores literais
(tal como o nmero 6), ou como
valores representados simbolicamente por
identificadores (variveis). Sem considerar como o valor est expresso, voc deve tomar
cuidado para distinguir os tipos de dados que LPD reconhece. O uso de dados de
modo no apropriado resulta em erros em tempo de compilao.
LPD possui dois tipos de dados padro:
Tipo numrico inteiro.
Tipo booleano.
Tipo Inteiro
LPD oferece o tipo numrico inteiro INTEGER. Este tipo fornece uma ampla
faixa de valores de nmeros inteiros, que vai de -32768 at +32767.
Um inteiro no possui valor decimal, e sempre perfeitamente preciso dentro de
sua faixa.
Valores Booleanos
Um valor booleano pode ser tanto VERDADEIRO (verdadeiro), como FALSO
(falso). (Os valores booleanos so assim chamados em homenagem ao matemtico ingls
do sculo dezenove George Boole. Usaremos algumas vezes o termo alternativo valor
lgico.)
LPD fornece um conjunto de operaes lgicas e relacionais, que produzem
expresses que resultam em valores VERDADEIRO ou FALSO. Veremos estas operaes
mais tarde.
O identificador padro BOOLEANO define uma varivel desse tipo, como neste
exemplo:
.
.
var
Achei : Booleano;
.
.
Os valores lgicos constantes VERDADEIRO e FALSO so
identificadores padro na linguagem LPD, e tem significado fixo para esta.
2.2.7
tambm
Comando de Atribuio
Uma vez que voc tenha declarado uma varivel de qualquer tipo, poder utilizar
um comando de atribuio para armazenar um valor na mesma.
A sintaxe do comando de atribuio a seguinte:
NomedaVarivel := Expresso;
Para executar este comando, o CSD avalia a expresso localizada no lado
direito do sinal de atribuio e armazena o valor resultante na varivel esquerda. O
nome da varivel aparece sempre sozinho, no lado esquerdo do sinal de atribuio. A
expresso localizada do lado direito pode ser simples ou complexa. Considere estes
exemplos:
.
.
var
Achei : booleano;
Numero,
Linha,
Coluna,
Local_Erro : inteiro;
.
.
Achei := VERDADEIRO;
Numero := 5;
Local_Erro := Coluna * (Linha + 160);
.
.
O primeiro exemplo atribui o valor booleano VERDADEIRO varivel Achei, o
segundo atribui o nmero 5 varivel Numero, o terceiro atribui o resultado de uma
expresso aritmtica varivel Local_Erro.
2.2.8
.
.
var X,
Y: inteiro;
.
.
Soma;
.
.
Em contraste, a chamada a uma funo no independente como um comando, mas
ao invs disso, aparece como parte de um comando maior. Geralmente uma funo est
relacionada a uma seqncia de operaes que conduzem a um nico valor calculado. Por
exemplo, considere a funo Exp a seguir:
funcao Exp: inteiro;
var Contador,
Resultado,
Base, Expoente : inteiro;
incio
leia(Base);
leia(Expoente);
Contador := 1;
Resultado := 1;
enquanto Contador <= Expoente faca
incio
Resultado := Resultado * Base;
Contador := Contador + 1;
fim;
Exp := Resultado;
fim;
A funo est definida para retornar um valor do tipo INTEGER. O comando de
atribuio no fim da funo especifica que Resultado o valor de retorno.
Auxiliar := Exp (3,4) * 5;
A varivel que recebe o valor retornado pela funo, bem como o resto da
expresso, deve ser do mesmo tipo da funo. No exemplo acima, Auxiliar deve ser do
tipo INTEGER.
2.2.10 Declarao Global X Local
Ns j vimos que os procedimentos e funes podem ter sua prpria seo
VAR. A localizao de um comando de declarao determina o escopo dos
identificadores correspondentes:
Declaraes em nvel de programa (localizadas imediatamente abaixo do cabealho
PROGRAMA), definem identificadores globais, ou seja, variveis que podem ser
usadas em qualquer ponto do programa.
representados
na
Multiplicao
Diviso
Adio
Subtrao
x := a * (b + c) div d;
Neste caso, a adio realizada primeiramente, depois a multiplicao e, por
ltimo, a diviso. Se as variveis tiverem os mesmos valores que antes, o novo resultado
ser 17.
Os parnteses podem estar aninhados dentro de uma expresso, ou seja, um
conjunto de parnteses pode aparecer completamente dentro de outro conjunto de
parnteses. O CSD executa a operao localizada dentro dos parnteses mais
internos primeiramente, e depois vai executando
as
operaes contidas nos
parnteses mais externos. Por exemplo, no comando a seguir, a adio executada
primeiramente, depois a diviso e finalmente, a multiplicao, dando um resultado igual a
15:
x := a * ((b + c) div d);
Numa expresso aninhada, cada "abre parnteses" deve ser correspondido por
um respectivo "fecha parnteses", ou ocorrer um erro em tempo de compilao.
Operaes Relacionais
Uma operao relacional compara dois itens de dados e fornece um valor booleano como
resultado da comparao. Aqui esto os seis operadores relacionais e os seus
significados:
= Igual
< Menor que
> Maior que
<= Menor ou igual a
>= Maior ou igual a
!= Diferente de
Voc pode usar estas operaes com dois valores do mesmo tipo. Por exemplo, digamos
que a varivel inteira Escolha contenha o valor 7. A primeira das expresses a seguir
fornece um valor falso, e a segunda um valor verdadeiro:
Escolha <= 5
Escolha > 4
Operaes Lgicas
A linguagem LPD possui trs operaes lgicas. Duas das quais - E, e OU - so
operaes binrias, usadas para combinar pares de valores lgicos em expresses lgicas
compostas. A terceira, NAO, uma operao unria que modifica um nico operando
lgico para o seu valor oposto. Fornecendo dois valores ou expresses lgicas,
representadas por Expresso1 e Expresso2, podemos descrever as trs operaes lgicas a
seguir:
Expresso1 E Expresso2 verdadeiro somente se ambas, Expresso1 e Expresso2,
forem verdadeiras. Se uma for falsa ou se ambas forem falsas, a operao E tambm
ser falsa.
fim;
No cometa o erro de omitir os marcadores INCIO/FIM nos comandos
compostos de uma estrutura SE. Alm disso, no coloque o ponto e virgula entre o FIM e o
SENAO numa estrutura SE. O CSD interpretar esta marcao incorreta como o fim do
comando SE sendo que a clusula SENAO, a seguir, resultar num erro em tempo de
compilao.Tendo em vista que a clusula SENAO opcional, a forma mais simples da
estrutura SE a seguinte:
se Condio
entao {comando ou comandos que
sero executados se a condio for VERDADEIRO};
Neste caso o programa executa o comando ou comandos aps a clusula ENTAO
somente se a condio for verdadeira. Se ela for falsa, o comando SE no ter nenhuma
ao. As estruturas SE podem estar aninhadas. Em outras palavras, toda uma estrutura de
deciso, com as clusulas SE, ENTAO, e SENAO, pode aparecer dentro de uma clusula
ENTAO ou SENAO de uma outra estrutura. O aninhamento de estruturas SE pode
resultar em seqncias de decises complexas e poderosas. Como exemplo, considere o
fragmento de programa a seguir:
.
.
se N < 2
entao G := G + N
senao incio
H := G;
P (N - 1, H);
G := H;
P (N - 2, G);
fim;
.
.
Neste exemplo, a deciso ser baseada no valor de N. Se N for menor que 2, o
programa soma N ao valor de G e armazena em G. Se o valor de N for maior ou igual a 2, o
programa executa o comando composto localizado aps a clusula SENAO.
2.2.12.2 A Estrutura do "Loop" ENQUANTO
Aqui est a sintaxe do "loop" ENQUANTO:
enquanto Condio faca
Comando;
Se o bloco do "loop" possuir um comando composto, a forma geral a seguinte:
enquanto Condio faca
incio
{comandos que sero executados uma
vez a cada iterao do "loop"}
fim;
Analisador
sinttico
Gerenciador
da tabela de
smbolos
Analisador
semntico
Gerador de
cdigo
intermedirio
Tratador de
erros
Otimizador
de cdigo
Gerador de
cdigo
Programa alvo
Ler caractere
entrada
Analisador
Sinttico
Programa fonte
Analisador
Lexical
Analisador
sinttico
Tabela de
smbolos
token
Programa
Fonte
Analisador
Lexical
Analisador
sinttico
Obter prximo
Token
rvore
Resto da
interface de
vanguarda
representao
intermediria
gramatical
Tabela de
smbolos
Identificao de sentenas.
Deteco de erros de sintaxe.
Recuperao de erros.
Montagem da rvore abstrata da sentena.
Comando de ativao do Analisador Lexical.
Ativao de rotinas de anlise semntica.
Ativao de rotinas de sntese do cdigo objeto.
visto que toda a sntese estar embasada na interpretao gerada por este analisador. Entre
as aes semnticas encontramos tipicamente as seguintes:
eficientes. Estes padres podem ser locais ou globais, e a estratgia de substituio pode ser
dependente ou independente da mquina.
Segundo Aho, o programa-fonte como entrada para um compilador uma
especificao de uma ao. O programa-objeto, a sada do compilador, considerado como
sendo outra especificao da mesma ao. Para cada programa-fonte, existem infinitos
programas-objeto que implementam a mesma ao, ou seja, produzem a mesma sada para
uma mesma entrada. Alguns desses programas-objeto podem ser melhores do que outros
com relao a critrios tais como tamanho ou velocidade. O termo otimizao de cdigo
refere-se s tcnicas que um compilador pode empregar em uma tentativa para produzir um
programa-objeto melhorado, para um dado programa-fonte. A qualidade de um programaobjeto pode ser medida por seu tamanho ou tempo de execuo. Para programas grandes, o
tempo de execuo particularmente importante. Para computadores de pequeno porte, o
tamanho do cdigo objeto pode ser to importante quanto o tempo. Deve-se observar com
cuidado o termo otimizao, devido dificuldade de se obter um compilador que produza o
melhor programa-objeto possvel, para qualquer programa-fonte, a um custo razovel.
Assim, um termo mais exato para otimizao de cdigo seria melhoria de cdigo (code
improvement).
resultado desta soma somado com o Lado 3. Em uma linguagem intermediria isso seria
representado da seguinte forma:
T1=b+c
T2=T1+d
A=T2
Com esta etapa realizada o compilador passa para a fase de sntese, que produzir a
linguagem assembly (cdigo produzido pela linguagem de montagem (assembler) ), e,
dependendo do compilador, efetuar duas otimizaes, global e local. Na primeira fase da
sntese o compilador ir buscar uma forma de otimizar, se possvel, as sentenas obtidas
pela anlise semntica. Esta fase chamada otimizao global. Podemos notar que a
sentena acima no foi otimizada. Uma possvel otimizao seria a eliminao das duas
ltimas sentenas em favor de uma que substitusse as duas como pode ser visto abaixo:
T1=b+c
A=T1+d
O passo seguinte seria a produo de linguagem assembly para o texto acima. Caso a
linguagem a ser produzida fosse para a arquitetura RISC_LIE, o cdigo que seria
produzido a partir do texto no otimizado seria:
Ldxw
Add
Stxw
Ldxw
Add
Stxw
Idwx
Stxw
b
c
t1
t1
d
t2
t2
a
b
c
d
a
4 Anlise Lexical
O analisador lexical a primeira fase de um compilador. Sua tarefa principal a de ler
os caracteres de entrada e produzir uma sequncia de tokens que o analisador sinttico
utiliza. Essa interao, sumarizada esquematicamente na Figura 4.1, comumente
implementada fazendo-se com que o Analisador Lexical seja uma sub-rotina ou uma corotina do analisador sinttico. Ao receber do analisador sinttico um comando obter o
prximo token, o Analisador Lexical l os caracteres de entrada at que possa identificar o
prximo token.
Token
Programa
Fonte
Analisador
Sinttico
Analisador
Lexical
Obter prximo
token
Tabela de
smbolos
Figura 4.1: Interao do Analisador Lexical com o analisador sinttico.
pi = 3.1416;
TOKEN
Const
Se
Relacional
id
num
literal
LEXEMAS EXEMPLO
const
se
< , <= , = , != , > , > =
pi , contador , D2
3 . 1416 , 0 , 6 . 02E23
contedo da memria
Smbolo : este um campo do tipo numrico que contm uma representao interna
para o token. Para aumentar a eficincia do sistema, toda a manipulao da
estrutura do token ser feita utilizando-se este campo. O CSD possui a seguinte
tabela de smbolo:
TOKEN
Lexema
programa
incio
fim
procedimento
funcao
se
entao
senao
enquanto
faca
:=
escreva
leia
var
inteiro
booleano
identificador
nmero
.
;
,
(
)
>
>=
=
<
<=
!=
+
*
div
e
ou
nao
:
Smbolo
sprograma
sincio
sfim
sprocedimento
sfuncao
sse
sentao
ssenao
senquanto
sfaca
satribuio
sescreva
sleia
svar
sinteiro
Sbooleano
Sidentificador
Snmero
Sponto
sponto_vrgula
Svrgula
sabre_parnteses
sfecha_parnteses
Smaior
Smaiorig
Sig
Smenor
Smenorig
Sdif
Smais
Smenos
Smult
Sdiv
Se
Sou
Snao
Sdoispontos
Lexema
Smbolo
se
sse
contador
sidentificador
>
smaior
10
snmero
entao
sentao
escreva
sescreva
sabre_parnteses
contador
sidentificador
sfecha_parnteses
senao
ssenao
escreva
sescreva
sabre_parnteses
sidentificador
sfecha_parnteses
sponto_vrgula
Lexema
Smbolo
N da lista de tokens.
5 Tabela de Smbolos
Uma funo essencial do compilador registrar os identificadores usados no
programa fonte e coletar as informaes sobre os seus diversos atributos. Esses atributos
podem ser informaes sobre a quantidade de memria reservada para o identificador, seu
tipo, escopo, (onde vlido o programa) e, no caso de nomes de procedimentos, coisas tais
como o nmero e os tipos de seus argumentos, o mtodo de transmisso de cada um (por
exemplo, por referncia) e o tipo retornado, se algum. Para armazenar estas informaes
existe a tabela de smbolos.
Uma tabela de smbolos uma estrutura de dados contendo um registro para cada
identificador, com os campos contendo os atributos do identificador. As informaes sobre
o identificador so coletadas pelas fases de anlise de um compilador e usada pelas fases de
sntese de forma a gerar o cdigo-alvo. Durante a Anlise Lexical a cadeia de caracteres que
forma um identificador armazenada em uma entrada da tabela de smbolos. As fases
seguintes do compilador acrescentam informaes a esta entrada. A fase de gerao utiliza
as informaes armazenadas para gerar o cdigo adequado.
Um mecanismo de tabela de smbolos precisa permitir que adicionemos novas
entradas e encontremos eficientemente as j existentes. til para um compilador ser capaz
de crescer a tabela de smbolos dinamicamente, se necessrio, em tempo de compilao. Se
o tamanho da tabela for esttico, ele deve ser grande o suficiente para tratar qualquer
programa fonte que lhe seja apresentado. Tal tamanho fixo traz o problema de desperdcio
na maioria dos casos.
Programa p ;
Var a: inteiro ;
Procedimento Q ;
Var b,c: inteiro ;
Incio . . . fim;
Procedimento R ;
Var d, e: inteiro ;
Procedimento S ;
Var f ,g: inteiro ;
Incio . . . fim ;
Incio . . . fim ;
...
fim .
Caminho de
busca usado na
compilao do
programa
c
Caminho de
busca usado na
compilao de
Q
Caminho de
busca usado na
compilao de
R
Caminho de
busca usado ao
se compilar S
incio {R }
. . . T; S;a: =b+c+d ; . . .
end ;
incio { Q }
... R; ...
end ;
incio
... Q; ...
end ;
EXEMPLO
No exemplo acima, os nomes visveis em cada procedimento so:
Em T, W e a so visveis
Em W, T e a so visveis
Em Q, T, a, b e R so visveis
Em R, T, a, Q, b, c, d e S so visveis
Em S, T, a, Q, b, c, R e d so visveis
Em P, T, a e Q so visveis
Durante a compilao de um procedimento, devem estar visveis os nomes definidos
localmente, e os nomes definidos dentro dos escopos mais externos dentro dos quais o
procedimento est contido.
A prioridade de busca deve ser tal que, no caso de um mesmo nome estar definido em
mais de um escopo, a definio feita no escopo mais interno prevalece.
Uma vez completada a compilao de um procedimento, os smbolos internos a ele
deixam de ser visveis. O prprio procedimento continua visvel dentro do escopo onde ele
definido.
Q
b
R
c
d
S
d
ltimo
Este modelo para a tabela, usando um vetor, supe que as buscas sero sequenciais.
Isso pode ser proibitivo se o nmero de smbolos for muito grande. A mesma lgica de
funcionamento pode ser aplicada a outras organizaes de tabela visando a melhoria no
tempo de acesso.
Procedimentos:
Coloca Tipo nas Variveis: percorre a tabela do final para o comeo substituindo todos
os campos tipo que possuem o valor varivel pelo tipo agora localizado.
6 Anlise Sinttica
Cada linguagem de programao possui as regras que descrevem a estrutura sinttica
dos programas bem-formados. Em Pascal, por exemplo, um programa constitudo por
blocos, um bloco por comandos, um comando por expresses, uma expresso por tokens e
assim por diante. A sintaxe das construes de uma linguagem de programao pode ser
descrita pelas gramticas livres de contexto (usando possivelmente a notao BNF). As
gramticas oferecem vantagens significativas tanto para os projetistas de linguagens quanto
para os escritores de compiladores.
Uma gramtica oferece, para uma linguagem de programao, uma especificao
sinttica precisa e fcil de entender.
Para certas classes de gramticas, podemos construir automaticamente um analisador
sinttico que determine se um programa-fonte est sintaticamente bem-formado. Como
benefcio adicional, o processo de construo do analisador pode revelar ambiguidades
sintticas bem como outras construes difceis de se analisar gramaticalmente, as quais
poderiam, de outra forma, seguir indetectadas na fase de projeto inicial de uma
linguagem e de seu compilador.
Uma gramtica propriamente projetada implica uma estrutura de linguagem de
programao til traduo correta de programas-fonte em cdigos-objeto e tambm
deteco de erros. Existem ferramentas disponveis para a converso de descries de
tradues, baseadas em gramticas, em programas operativos.
As linguagens evoluram ao longo de um certo perodo de tempo, adquirindo novas
construes e realizando tarefas adicionais. Essas novas construes podem ser mais
facilmente includas quando existe uma implementao baseada numa descrio
gramatical da linguagem.
O ncleo desta seo est devotado aos mtodos de anlise sinttica que so
tipicamente usados nos compiladores. Apresentamos primeiramente os conceitos bsicos,
em seguida as tcnicas adequadas implementao manual e finalmente os algoritmos
usados.
Analisador
Lexical
Analisador
sinttico
Obter prximo
Token
Resto da
interface de
vanguarda
gramatical
Tabela de
smbolos
Figura 6.1: Posio de um analisador sinttico num modelo de compilador
intermediria
a1
a2
.........
an
3) Repetir o passo (2) at que = smbolo inicial da gramtica. Caso isso no seja possvel
tem-se que a cadeia analisada no pertence a linguagem especificada.
Exemplo:
G= ({E,T,F},{a,b,+,*,(,)},P,E)
P: E E + T | T
TT*F|F
F a | b | (E)
Verificando se a cadeia a+b*a pertence a linguagem utilizando-se de anlise
sinttica ascendente.
a+b*a => F+b*a => T+b*a => E+b*a => E+F*a => E+T*a => E+T*F =>
a
E+T => E
T*F
E+T
Nas gramticas LL(1) cada regra de derivao apresenta smbolo inicial da cadeia
resultante diferenciado dos demais, o que facilita sua escolha. Como nas linguagens de
programao isso ocorre com frequncia, ela se mostra adequada para uso em compiladores.
No resto desta seo, consideraremos a natureza dos erros sintticos e as estratgias
gerais para sua recuperao. Duas dessas estratgias, chamadas modalidade do desesperoe
recuperao em nvel de frase, so discutidas mais pormenorizadamente junto com os
mtodos individuais de anlise sinttica. A implementao de cada estratgia requer o
julgamento do desenvolvedor do compilador, mas daremos algumas diretrizes gerais
relacionadas a essas abordagens.
programa prmax;
var
x, y: inteiro;
funcao max (i: inteiro; j: inteiro) :
{ retorna maximo de i e j }
incio
se i > j entao max := i
senao max := j
fim;
incio
leia (x, y) ;
escreva (max (x, y) )
fim.
modalidade do desespero
nvel de frase
produes de erro
correo global
seno Chamada_procedimento
fim
Algoritmo Analisa_leia <comando leitura>
incio
Lxico(token)
se token.simbolo = sabre_parenteses
ento incio
Lxico(token)
se token.simbolo = sidentificador
ento se pesquisa_declvar_tabela(token.lexema)
ento incio (pesquisa em toda a tabela)
Lxico(token)
se token.simbolo = sfecha_parenteses
ento Lxico(token)
seno ERRO
fim
seno ERRO
seno ERRO
fim
seno ERRO
fim
Algoritmo Analisa_escreva <comando escrita>
incio
Lxico(token)
se token.simbolo = sabre_parenteses
ento incio
Lxico(token)
se token.simbolo = sidentificador
ento se pesquisa_ declvarfunc_tabela(token.lexema)
ento incio
Lxico(token)
se token.simbolo = sfecha_parenteses
ento Lxico(token)
seno ERRO
fim
seno ERRO
seno ERRO
fim
seno ERRO
fim
Algoritmo Analisa_enquanto <comando repetio>
Def auxrot1,auxrot2 inteiro
incio
auxrot1:= rotulo
Gera(rotulo,NULL,
,
)
{incio do while}
rotulo:= rotulo+1
Lxico(token)
Analisa_expresso
se token.simbolo = sfaa
ento incio
auxrot2:= rotulo
Gera(
,JMPF,rotulo,
)
{salta se falso}
rotulo:= rotulo+1
Lxico(token)
Analisa_comando_simples
Gera(
,JMP,auxrot1,
Gera(auxrot2,NULL,
,
fim
seno ERRO
fim
ento incio
pesquisa_declproc_tabela(token.lexema)
se no encontrou
ento incio
Insere_tabela(token.lexema,procedimento,nvel, rtulo)
{guarda na TabSimb}
Gera(rotulo,NULL,
,
)
{CALL ir buscar este rtulo na TabSimb}
rotulo:= rotulo+1
Lxico(token)
se token.simbolo = sponto_vrgula
ento Analisa_bloco
seno ERRO
fim
seno ERRO
fim
seno ERRO
DESEMPILHA OU VOLTA NVEL
fim
Algoritmo Analisa_ declarao_funo <declarao de funo>
incio
Lxico(token)
nvel := L (marca ou novo galho)
se token.smbolo = sidentificador
ento incio
pesquisa_declfunc_tabela(token.lexema)
se no encontrou
ento incio
Insere_tabela(token.lexema,,nvel,rtulo)
Lxico(token)
se token.smbolo = sdoispontos
ento incio
Lxico(token)
se (token.smbolo = Sinteiro) ou
(token.smbolo = Sbooleano)
ento incio
se (token.smbolo = Sinteger)
ento TABSIMB[pc].tipo:=
funo inteiro
seno TABSIMB[pc].tipo:=
funo boolean
Lxico(token)
se token.smbolo = sponto_vrgula
ento Analisa_bloco
fim
seno ERRO
fim
seno ERRO
fim
seno ERRO
fim
seno ERRO
DESEMPILHA OU VOLTA NVEL
fim
Fim
Ento incio
Lxico(token)
Analisa_expresso(token)
Se token.simbolo = sfecha_parenteses
Ento Lxico(token)
Seno ERRO
Fim
Seno Se (token.lexema = verdadeiro) ou
(token.lexema = falso)
Ento Lxico(token)
Seno ERRO
Exerccio:
Elaborar os algoritmos para os seguinte procedimentos:
Analisa Chamada de Procedimento
Analisa Chamada de Funo
7 Analisador Semntico
At agora a preocupao foi em analisar sintaticamente os programas-fonte de
acordo com as suas respectivas gramticas, considerando que um programa-fonte fosse
simplesmente uma sequncia de caracteres. Entretanto, para gerar corretamente os cdigosobjeto de um programa-fonte, um compilador deve ser capaz de reconhecer os tipos de
smbolos (por exemplo, se eles so do tipo inteiro, do tipo ponto flutuante ou de um novo
tipo construdo) e a consistncia do seu uso (por exemplo, o operador aritmtico mod em
Pascal ou o operador /).
Os programas em linguagem de alto nvel contm normalmente uma seo de
declarao de dados (identificadores) e uma de comandos e expresses propriamente ditos.
A consistncia do uso de um identificador na seo de comandos depende da sua declarao
(explcita ou implcita). Este tipo de dependncia s pode ser satisfatoriamente contemplado
por uma gramtica sensitiva ao contexto. Entretanto, existem poucos resultados prticos que
formalizam e processam, de forma satisfatria, as gramticas sensitivas.
Por visvel considera-se como aquele que pode ser encontrado na Tabela de Smbolos atual.
compatvel com o uso (exemplo: varivel usada que existe como nome de programa ou
de procedimento na tabela de smbolos deve dar erro).
3) Verificao de compatibilidade de tipos. Sempre que ocorrer um comando de
atribuio, verificar se a expresso tem o mesmo tipo da varivel ou funo que a
recebe.
4) Verificao dos comandos escreva e leia.
5) Verificao de chamadas de procedimento e funo.
6) Verificao dos operadores unrios , + , nao.
fcil perceber que as chamadas para o analisador semntico no passam de linhas de
comandos a serem inseridos no corpo do analisador sinttico, nos locais apropriados.
Vale lembrar que a Linguagem LPD no permite a passagem de parmetros nos
procedimentos e funes. Caso isso fosse permitido, ento deveriamos tambm verificar a
consistncia no nmero de argumentos e parmetros, bem como sua compatibilidade de
tipos.
Suporemos que cada uma das trs regies tm palavras numeradas com 0, 1, 2,..., e
no nos preocuparemos com as limitaes de tamanho de cada regio, nem de cada palavra.
A MVD ter dois registradores especiais que sero usados para descrever o efeito
das instrues:
-
s->
*
*
*
m+2
m+1
s->
*
*
*
*
*
*
m+2
v1
?
s->
v2
m+2
m+1
v1
m+1
*
*
*
***
clculo de v 1
*
*
*
s->
*
*
*
***
clculo de v 2
Figura 8.1
v2
m+2
m+1
*
*
*
v=v1 * v2
para a MVD, mas devemos notar que algumas dessas definies so provisrias, e sero
modificadas mais adiante. O efeito de cada instruo est descrito numa notao semelhante
da LPD, indicando as modificaes no estado dos registradores e da memria da MVD.
Omitimos nesta descrio a operao i:=i+1 que est implcita em todas as instrues,
exceto quando h desvio. Adotaremos, tambm, a conveno de representar os valores
booleanos por inteiros: verdadeiro por 1 e falso por 0.
LDC
(Carregar constante):
S:=s + 1 ; M [s]: = k
LDV n (Carregar valor):
S:=s+1 ; M[s]:=M[n]
ADD
(Somar):
M[s-1]:=M[s-1]+M[s]; s:=s-1
SUB
(Subtrair):
M[s-1]:=M[s-1]-M[s]; s:=s-1
MULT
(Multiplicar):
M[s-1]:=M[s-1]*M[s]; s:=s-1
DIVI
(Dividir):
M[s-1]:=M[s-1]div M[s]; s:=s-1
INV
(Inverter sinal):
M[s]:=-M[s]
AND
(Conjuno):
Se M [s-1]=1 e M[s]=1 ento M[s-1]:=1 seno M[s-1]:=0; S:=s-1
OR
(Disjuno):
Se M[s-1]=1 ou M[s]=1 ento M[s-1]:=1 seno M[s-1]:=0; s:=s-1
NEG
(Negao):
M[s]:=1-M[s]
CME
(Comparar menor):
Se M[s-1]<M[s] ento M[s-1]:=1 seno M[s-1]:=0; s:=s-1
CMA
(Comparar maior):
Se M[s-1] >M[s] ento M[s-1]:=1 seno M[s-1]:=0;s:=s-1
CEQ
(comparar igual):
Se M[s-1]=M[s] ento M[s-1]:=1 seno M[s-1]:=0;s:=s-1
CDIF
(Comparar desigual):
Se M[s-1] M[s] ento M[s-1]:=1 seno M[s-1]:=0; s:=s-1
CMEQ
(Comparar menor ou igual)
Se M[s-1] M[s] ento M[s-1]:=1 seno M[s-1]:=0;s:=s-1
CMAQ
(Comparar maior ou igual):
Se M[s-1] M[s] ento M[s-1]:=1 seno M[s-1]:=0; s:=s-1
k
Exemplo:
Consideremos a expresso a + (b div 9 - 3) * c, e suponhamos que os endereos
atribudos pelo compilador s variveis a, b e c so, respectivamente, 100, 102, e 99. Ento
o trecho do programa-objeto correspondente traduo desta expresso seria:
LDV
LDV
LDC
DIVI
LDC
100
102
9
3
SUB
LDV 99
MULT
ADD
Suponhamos que os valores armazenados nas posies 99, 100 e 102 da pilha so
2, 10 e 100, respectivamente, e que o registrador s contm o valor 104. As configuraes
sucessivas da pilha ao executar as instrues acima so dadas na Figura 8.2. Os valores
sucessivos de s esto indicados pelas flechas.
Uma observao interessante que o cdigo da MVD gerado para expresses est
diretamente ligado com a notao polonesa posfixa, que no caso da expresso do exemplo
acima seria ab9 div 3-c*+. Esta sequncia de smbolos deve ser comparada com a sequncia
de instrues da MVD desse exemplo.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
107
106
100
100
11
105
10
10
10
10
104
103
100
102
100
100
100
100
101
10
100
10
10
10
10
-2
99
-2
-2
-2
-2
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
LDV 100
LDV 102
LDC 9
DIVI
LDC 3
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
-2
-2
107
-2
11
106
-16
-16
10
105
10
10
10
-6
104
103
100
102
100
100
100
100
101
10
100
10
10
10
10
-2
99
-2
-2
-2
-2
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
SUB
LDV 99
MULT
ADD
Figura 8.2
(Armazenar valor):
M[n]:=M[s]; s:=s-1
Exemplo:
Consideremos o comando a:=a+b*c e suponhamos que os endereos e os valores
destas variveis so os mesmos do exemplo anterior. O cdigo da MVD para este comando
ser:
LDV
LDV
LDV
MULT
ADD
STR
100
102
99
100
p (Desviar sempre):
i:=p
JMPF p (Desviar se falso):
Se M[s]=0 ento i:=p seno i:=i+1;
S:=s-1
Nestas instrues, p um nmero inteiro que indica um endereo de programa da
MVD. Nos exemplos que se seguem utilizaremos rtulos simblicos no lugar de nmeros.
Note-se que, haja ou no desvio, a instruo JMPF elimina o valor que foi testado, e que
est no topo da pilha.
Introduziremos, por convenincia, mais uma instruo que no estritamente
necessria, mas que simplifica o processo de traduo e que no tem nenhum efeito sobre a
execuo:
NULL (Nada):
*
*
*
*
*
*
*
*
*
*
*
*
107
-2
106
100
100
105
10
10
10
104
103
100
102
100
100
100
101
10
100
10
10
10
-2
99
-2
-2
-2
*
*
*
*
*
*
*
*
*
*
*
*
LDV 100
LDV 102
LDV 99
MULT
*
*
*
*
*
*
*
*
*
-2
107
-2
-2
-200
106
-200
-200
10
105
-190
-190
104
103
100
102
100
100
101
10
100
10
-190
-2
99
-2
-2
*
*
*
*
*
*
*
*
*
ADD
STR
100
Figura 8.3
traduo de E
traduo de C 1
traduo de C 2
traduo de E
traduo de C
traduo de E
traduo de C
Q
L1
1
A
L2
2
A
LDV A
LDV B
CMA
JMPF L3
LDV P
LDV Q
AND
STR
Q
JMP L4
L3 NULL
LDV A
LDC 2
LDV B
MULT
CME
JMPF L5
LDC 1
STR
P
JMP L6
L5 NULL
LDC 0
STR
Q
L6 NULL
L4 NULL
3. enquanto s< =n faca s:=s+3*s
L7 NULL
LDV S
LDV N
CMEQ
JMPF L8
LDV S
LDC 3
LDV S
MULT
ADD
STR
S
JMP L7
L8 NULL
(Leitura):
S:=s+1; M[s]:= prximo valor de entrada.
(Impresso):
Imprimir M[s]; s:=s-1
V1
Exemplo:
1. leia(a)
RD
STR
A (endereo de a)
2. escreva(x)
LDV
PRN
X (endereo de x)
8.6 Sub-Programas
A Figura 8.4 mostra um programa muito simples, sem procedimentos. Deveria ser
claro que, neste caso, o programa-objeto deveria reservar as cinco posies iniciais da pilha
para as variveis, e em seguida comear a executar as instrues
programa exemplo5;
var n, k: inteiro;
f1, f2, f3: inteiro;
incio
leia(n);
f1:=0; f2:=1;k:=1;
enquanto k<=n
faca incio
f3:=f1+f2;
f1:=f2; f2:=f3;
k:=k+1
fim;
escreva (n);
escreva (f1)
fim.
Figura 8.4
(Parar):
Pra a execuo da MVD
Exemplo:
Indicamos a seguir o programa-objeto que resulta da traduo do programa da
Figura 8.4. Fragmentos do programa-fonte so usados como comentrios a fim de tornar
mais clara a traduo:
L1
START
ALLOC 2
ALLOC 3
RD
STR
0
LDC
0
STR
2
LDC
1
STR
3
LDC
1
STR
1
NULL
LDV 1
LDV 0
CMEQ
JMPF L2
LDV 2
LDV 3
ADD
STR
4
LDV 3
STR
2
LDV 4
STR
3
LDV 1
LDC
1
ADD
STR
1
programa
var n, k
fl, f2, f3
leia (n)
fl:=0
f2:=1
k:=1
enquanto
k<=n
faca
f3:=f1+f2
f1:=f2
f2:=f3
k:=k+1
L2
JMP
L1
NULL
LDV 0
PRN
escreva (n)
LDV 2
PRN
escreva (f1)
DALLOC 3
DALLOC 2
HLT
fim.
X: 4,3,2,1,0
y: 1,1,2,6,24
P/ 2
z:4
P/ 1
z:3
P/1
z:2
P/1
z:1
Figura 8.6
(Desalocar memria):
Para k:=n-1 at 0 faa
{M[m+k]:=M[s];s:=s-1}
z3
*
*
*
z1
z2
z2
*
*
*
*
*
*
z1
z1
z1
*
*
*
*
*
*
*
*
*
z2
z3
z4
Figura 8.7
Exemplo:
O programa da Figura 8.5 produz a seguinte traduo:
L2
L3
L4
L1
START
ALLOC 0,2
JMP
L1
NULL
ALLOC 2,1
LDV
0
STR
2
LDV
0
LDC
1
SUB
STR
0
LDV
2
LDC
1
CMA
JMPF L3
CALL L2
JMP
L4
NULL
LDC
1
STR
1
NULL
LDV
1
LDV
2
MULT
STR
1
DALLOC 2,1
RETURN
NULL
RD
STR
0
CALL L2
LDV
0
PRN
LDV
1
PRN
DALLOC 0,2
HLT
programa
var x,y
procedimento p
var z
z:=x
x:=x-1
se z>1
entao
p
senao
y:=1
y:=y*z
fim
leia(x)
p
escreva (x)
escreva (y)
fim.
9 Bibliografia
Aho,A.V.; Sethi,R.; Ullman,J.D. Compiladores: Princpios, Tcnicas e Ferramentas Livros Tcnicos e Cientficos.
Hopcroft,J.E; Ullman,J.D. Formal Languages end their relation to Automata - AddisonWesley Series.
Hopcroft,J.E; Ullman,J.D.
Introduction do Automata Theory, Languages and
Computation - Addison-Wesley Series.
Kowaltowski,T. Implementao de Linguagens de Programao - Ed. Guanabara Dois.