Você está na página 1de 146

Compiladores

Prof. Srgio de Barros Pinto

ltima atualizao: 10/09/2010

Compiladores - Tpicos
-Linguagens e suas representaes - Linguagens; - Gramticas; - Representao BNF; -Grafos sintticos; e - rvores de anlise sinttica (rvores de derivao) - Arvores sintticas (rvores reduzidas de anlise sinttica) -Compiladores - Traduo de linguagens de programao - Analise lxica; - Analise sinttica; - Traduo dirigida por sintaxe; - Gerao de cdigo intermedirio; - Otimizao de cdigo; - Gerncia de memria; 2 - Gerao de cdigo objeto;

Linguagens e Suas Representaes

O Problema da Torre de Babel

Torre de Babel
a) Cdigo de Mquina do Processador Motorola MC 68000 23FC 0000 0CB9 0000 6E0C 06B9 0000 06E8 0001 0000 0040 000A 0000 0040 0001 0000 0040

b) Linguagem de Montador (Assembly) do Processador MC 68000 #0X1,N COMPARE:CMPL #0XA,N BGT END_OF_LOOP ADDL #0X1,N BRA COMPARE END_OF_LOOP: MOVL

Torre de Babel
c) Linguagem FORTRAN 2 DO 2 N=1,10 CONTINUE

d) Linguagem COBOL MOVE 1 TO N. AGAIN. IF N IS EQUAL TO 10 GOTO END_DEMO. ADD 1 TO N. END_DEMO.


6

Torre de Babel
e) Linguagem C For (N=1; N<=10; N++) { } f) Linguagem ADA For N in 1..10 Loop NULL; End Loop; g) Matemtica
10 N =1

h) Portugus N variando entre 1 e 10 Podemos ver, pelos exemplos, que cada linguagem tem suas prprias 7 regras e utiliza seu prprio vocabulrio.

Linguagens
Linguagem : o conjunto de palavras e mtodos de combin-las, usados e entendidos por uma comunidade. Ex: Portugus, Ingls, Matemtica, Algol, Pascal, Qumica, etc... Alfabeto ou vocabulrio: um conjunto finito de smbolos da linguagem. Ex: Alfabeto latino { a, b, c, ..., z}; Alfabeto grego { , , , ...., }; Alfabeto binrio { 0, 1).

Linguagens
Sentenas: qualquer cadeia de tamanho limitado, composta de smbolos da linguagem. Ex: Eu estou estudando. (Portugus); A = B + C (Matemtica); For ( i = 1; i <= 5; i++ ) { a[i] = b[i] + c[i]; } ( Linguagem C ) Se V um alfabeto, ento V* o conjunto de todas as sentenas compostas por smbolos de V, inclusive a sentena vazia . V* chamado de fechamento transitivo de concatenao. V+ usado para designar o conjunto V* - {}.
9

Linguagens
Ex: Se V = {0, 1} ento, V* = {, 0, 1, 00, 01, 10, 000, ....} e V+ = { 0, 1, 00, 01, 10, 000, ....}

Ex: Se V = {01} ento, V* = {, 01, 0101, 010101, ....} e V+ = { 01, 0101, 010101, ....} Ex: c* = { , c, cc, ccc, cccc, .....} abc*d = { abd, abcd, abccd, abcccd, abccccd, .....}
10

Gramtica
o conjunto de regras que define a gerao das sentenas de uma linguagem. Formalmente as gramticas podem ser caracterizadas como qudruplas ordenadas: G = (V, , P, S) onde: V representa o vocabulrio da gramtica G. Este vocabulrio corresponde ao conjunto de todos os elementos simblicos, dos quais gramtica se vale para definir as leis de formao das sentenas da linguagem.

representa alguns elementos de V, que so os smbolos ou


tomos dos quais as sentenas da linguagem so constitudas. Aos elementos de d-se o nome de terminais.
11

Gramtica G = (V, , P, S) Os elementos de V que no pertencem a so usados pela gramtica


para definir construes auxiliares ou intermedirias na formao das sentenas. A estes elementos d-se o nome de no-terminais e seu conjunto N obedece relao: V = , com =

P representa o conjunto de todas as leis de formao utilizadas


pela gramtica para definir a linguagem. A cada uma dessa regras de formao que compem o conjunto P, d-se o nome de produo da gramtica. Cada produo tem a forma , onde , no caso geral, uma > cadeia contendo no mnimo um no-terminal, ou seja V* N V* e uma cadeia, eventualmente vazia, de terminais e no-terminais, portanto V*.
12

Gramtica G = (V, , P, S) S um elemento de N, cuja propriedade ser o no-terminal que d incio ao processo de gerao de sentenas. S chamado de smbolo
inicial da gramtica. Exemplos: G1 = (V1, 1, P1, S1) V1 = { A, B, 0, 1} 1 = {0, 1} P1 = { A 0A, A B, B 1B, B } S1 = A Obteno de Sentenas : A 0A aplicando A 0A A 00A A B A 00B B 1B A 001B B 1B A 0011B B portanto: A 0011 uma sentena da gramtica

13

Gramtica G = (V, , P, S)
Exemplos: Cdigo Morse = (V, , P, S) V = { A, , } = {, } P = { A A, A A, A } S=A Obteno de Sentenas : A A aplicando A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A uma sentena vlida 14 S O S

Gramtica G = (V, , P, S)
Exemplos: G2 = (V2, 2, P2, S2) V2 = {<sentena>, <sujeito>, <predicado>, <artigo>, muito <substantivo>,<verbo>,<advrbio> , garoto, o, corre } 2 = {muito, garoto, o, corre} P2 = {<sentena> <sujeito><predicado>, <sujeito> <artigo> <substantivo>, <predicado> <verbo> <advrbio>, <artigo> o, <verbo> corre, <advrbio> muito, <substantivo> garoto} S2 = <sentena> Obteno de Sentenas : <sentena> <sujeito> <predicado> <sentena> <artigo> <substantivo> <predicado> <sentena> O garoto <predicado> <sentena> O garoto <verbo> <advrbio> <sentena> O garoto corre muito
15

Estrutura Sinttica de Uma Linguagem Formalismo de Backus Naur (BNF)


A sintaxe de uma linguagem o conjunto de regras que define a gerao de sentenas dessa linguagem. Portanto, um modo de definirmos a sintaxe de uma linguagem escrevermos o seu conjunto de regras. Uma maneira de fazermos isso usando um formalismo chamado Backus Naur Form ou BNF : <nome da classe sinttica> ::= definio da classe sinttica Exemplo: < identificador> ::= alfa | beta | gama onde ::= significa definido como | significa ou < > identifica os smbolos no-terminais da linguagem
16

Estrutura Sinttica de Uma Linguagem Formalismo de Backus Naur (BNF)


Exemplo: < atribuio > ::= < identificador > = < expresso > ; < expresso > ::= < termo > | < expresso > + < termo > < termo > ::= < identificador > | < termo > * < identificador > < identificador> ::= A | B | C | D As sentenas geradas a partir desse conjunto de produes uma sentena vlida da linguagem.

17

Estrutura Sinttica de Uma Linguagem Formalismo de Backus Naur (BNF)


Exemplo de obteno de sentenas vlidas: < identificador > = < expresso > ; A = < expresso > ; A = < expresso > + < termo > ; A = < termo > + < termo > ; A = < termo > + < termo > + < identificador >; A = < termo > + < termo > + D; A = < identificador > + < termo > + D ; A = B + < termo > + D ; A = B + < identificador > + D ; A = B+ C + D; Portanto: A = B + C + D , uma sentena da linguagem.
18

Exerccios

Dada a gramtica: G1 = (V1, 1, P1, S1) V1 = { A, B, 0, 1} 1 = {0, 1} P1 = { A 0A, A B, B 1B, B } S1 = A Provar que as sentenas abaixo so sentenas vlidas da gramtica: a) 111001 b) 011111 c) 000001 d) 00011

19

Exerccios - Resultados
a) 111001 Obteno da Sentena : A B aplicando B 1B A 1B B 1B A 11B B 1B A 111B Como no existe produo que partindo de B nos permita obter o valor zero, a sentena no vlida para a gramtica em questo. b) 011111 Obteno da Sentena : A 0A aplicando A 1B A 01B B 1B A 011B B 1B A 0111B B 1B A 01111B B 1B A 011111B B A 011111 c.q.d.

20

c) 000001 Obteno da Sentena : A 0A aplicando A 0A A 00A A 0A A 000A A 0A A 0000A A 0A A 00000A A B A 00000B B 1B A 000001B B A 000001 c.q.d. d) 00011 Obteno da Sentena : A 0A aplicando A 0A A 00A A 0A A 000A A B A 000B B 1B A 0001B B 1B A 00011B B A 00011 c.q.d.

Exerccios - Resultados

21

Exerccio
Verifique se a sentena begin A:= B + C ; B := C end pertence linguagem definida pela gramtica abaixo: < programa > ::= begin < lista de declaraes > end < lista de declaraes > ::= < declarao > | < declarao > ; < lista de declaraes > < declarao > ::= < varivel > := < expresso > < varivel > ::= A | B | C < expresso > ::= < varivel > + < varivel > | < varivel > - < varivel > | < varivel >
22

Exerccio - Resultado
Verifique se a sentena begin A:= B + C ; B := C end <programa> ::= begin < lista de declaraes > end begin < lista de declaraes > end begin < declarao > ; < lista de declaraes > end begin < varivel > := < expresso > ; < lista de declaraes > end begin A := < expresso > ; < lista de declaraes > end begin A := < varivel > + < varivel > ; < lista de declaraes > end begin A := B + < varivel > ; < lista de declaraes > end begin A := B + C ; < lista de declaraes > end begin A := B + C ; < declarao > end begin A := B + C ; < varivel > := < expresso > end begin A := B + C ; B := < expresso > end begin A := B + C ; B := < varivel > end begin A := B + C ; B := C end c.q.d 23

Notao BNF Estendida (EBNF)


Notao BNF normal < expresso > ::= < varivel > + < expresso > | < varivel > - < expresso > | < varivel > Notao BNF estendida < expresso > ::= < varivel > { [+, - ] < varivel > }* onde [ ] indica que os smbolos internos so opcionais; e { }* indica um fechamento transitivo de concatenao
24

Grafo Sinttico
uma maneira grfica de representar as regras sintticas de uma linguagem na forma EBNF. < programa > ::= begin < lista de declaraes > end <programa> begin lista de declarao end

< lista de declaraes > ::= < declarao > | < declarao > ; < lista de declaraes > < lista de declaraes > declarao ;
25

Grafo Sinttico

< declarao > ::= < varivel > := < expresso > < declarao > varivel := expresso

< varivel > ::= A | B | C < varivel > A B C


26

Grafo Sinttico

< expresso > ::= < varivel > + < varivel > | < varivel > - < varivel > | < varivel > < expresso > varivel varivel varivel
27

+ -

varivel varivel

Regras de Construo do Grafo Sinttico

28

Regras de Construo do Grafo Sinttico - Exerccio Dada a gramtica abaixo, desenhar o grafo sinttico correspondente: < programa > ::= program < declarao >* end < declarao > ::= < atribuio > | < lao > < atribuio > ::= < identificador > := < expresso > ; < lao > ::= while < expresso lgica > do < declarao >+ done < expresso > ::= < valor > | < valor > + < valor > | < valor > - < valor > | < valor > * < valor > | < valor > / < valor > < expresso lgica > ::= < valor > = < valor > | < valor > > < valor > | < valor > < < valor > < valor > ::= < identificador > | < nmeros > < identificador > ::= { a,b,c,..., z }+ < nmeros > ::= { 0,1,2,..., 9 }+
29

- Exerccio ( Soluo ) -

30

- Exerccio ( Soluo ) -

31

- Exerccio ( Soluo ) -

32

- Exerccio ( Soluo ) -

33

rvore de Anlise Sinttica ( Parse Tree)


Mostra a hierarquia da estrutura sinttica das sentenas. rvore de anlise sinttica da sentena A:= B * ( A + C )

Gramtica < atribuio > ::= < id > := < expr > < id > ::= A|B|C < expr > ::= < id > + < expr > | < id > * < expr > | ( < expr > ) | < id >
34

Gramtica Ambgua
a gramtica que permite mais de uma rvore de anlise sinttica para uma mesma sentena. Gramtica <atribuio> ::= <id> := <exp > <id> ::= A|B|C <expr> ::= <expr> + <expr> | <expr> * <expr> | ( <expr> ) | <id>

Sentena A:= B + C * A

35

rvore de Anlise Sinttica - Exerccio


Dada a gramtica abaixo, construir as rvores de anlise sinttica p/ as sentenas A:= B + C * A Gramtica <atribuio> ::= <id> := <exp > <id> ::= A|B|C <expr> ::= <expr> + <termo> | <termo> <termo> ::= <termo> * <fator> | <fator> <fator> ::= ( <expr> ) | <id> OBS: Esta uma gramtica no ambgua para atribuies.
36

A:= (B + C) * A

rvore de Anlise Sinttica - Soluo do Exerccio

A:= B + C * A

37

rvore de Anlise Sinttica - Soluo do Exerccio

A:= ( B + C ) * A

38

rvore de Anlise Sinttica - Exerccio


Dada a gramtica G1 = (V1, 1, P1, S1) V1 = { A, B, 0, 1} 1 = {0, 1} P1 = { A 0A, A B, B 1B, B } S1 = A Criar as rvores de anlise sinttica para as sentenas abaixo: 01111 00111 00011 00001 00000 11111 10101
39

rvore de Anlise Sinttica Exerccio (continuao)


01111 00111

40

rvore de Anlise Sinttica - Exerccio (continuao)


00011 00001

41

rvore de Anlise Sinttica Exerccio (continuao)


00000 11111

42

rvore de Anlise Sinttica Exerccio (continuao)


10101

Como no existe produo que partindo de B implique na obteno de um 0, a sentena no pode ser obtida e portanto ela no uma sentena da gramtica.

43

rvore de Anlise Sinttica Exerccio


Dada a gramtica abaixo, verificar, usando rvore de anlise sinttica, se a sentena: int alfa, beta[100]; uma sentena vlida. OBSERVAO: Uma sentena vlida quando as folhas da rvore de anlise sinttica s contm terminadores da gramtica. <declarao> ::= <tipo> <varivel > ; | <tipo> <listaVariveis> ; <listaVariveis> ::= <varivel> | <varivel> , <listaVariveis> <varivel> ::= <identificador> | <identificador> [<nmero>] <tipo> ::= int | float | char < identificador > ::= { a,b,c,..., z }+ < nmero > ::= { 0,1,2,..., 9 }+

44

rvore de Anlise Sinttica Exerccio (continuao...)

Portanto a sentena: int alfa, beta[100]; uma sentena vlida.


45

Autmatos de Estados Finitos


Autmatos de estados finitos so mquinas abstratas (modelos matemticos) capazes de reconhecer estruturas de linguagens. Um autmato finito AF, sobre um alfabeto A, representado por: AF = (E,e0, Ef, A, G) Onde: E um conjunto finito denominado conjunto de estados. O conjunto E deve conter pelo menos 1 estado. e0 o estado inicial do autmato. e0 pertence a E. Ef o conjunto de estados finais, no vazio. Ef est contido em E. A um conjunto finito, denominado alfabeto de entrada. G: E x A S, denomina-se aplicao de transio e representa o mapeamento das transies E x A. Obs: G(E, A) no precisa estar definida pra todos os pares E, A 46 (estado, smbolo de entrada).

Autmatos de Estados Finitos


Um autmato pode ser representado atravs de grafos (ou diagramas) de estado ou de tabelas de transio de estados. Um diagrama de estado usa a seguinte simbologia:

A mudana de um estado Sn-1 para um estado Sn, ocasionada por uma entrada e, representada por:

47

Autmatos de Estados Finitos


Exemplo: Dado o autmato AF = ({S0,S1}, S0, {S1}, {0, 1}, G) Com as seguintes transies de estado definidas em: g(S0, 0)=S0; g(S0, 1)=S1; g(S1, 0) = S0; g(S1, 1)=S1; Ento o diagrama de estados correspondente dado por:

48

Autmatos de Estados Finitos


Uma tabela de transio de estados tem a seguinte representao g(S0, 0)=S0; g(S0, 1)=S1; g(S1, 0) = S0; g(S1, 1)=S1; Ento o diagrama de estados correspondente dado por:

O primeiro estado na coluna de estados e o estado inicial.

49

Autmatos de Estados Finitos


Tabela de transio de estados para o autmato do exemplo anterior:

Onde: S0 o estado inicial (primeira posio na coluna de estados); S1 o estado final (valor 1 na coluna de indicao de estados final e no-final) A leitura da tabela se d da seguinte forma: Na linha 1: estando o autmato no estado S0: ao receber uma entrada 0 ele continua no estado S0; ao receber uma entrada 1 ele passa ao estado S1. Na linha 2: estando o autmato no estado S1: ao receber uma entrada 0 ele passa ao estado S0; ao receber uma entrada 1 ele continua no estado S .

50

Autmatos de Estados Finitos


Exemplo: Criar um autmato para representar uma moeda sobre a mesa. Considere que a moeda inicialmente exibe o lado cara. O autmato : AF = ({cara,coroa}, cara, {cara, coroa}, {virar}, G) Com as seguintes transies de estado definidas em G: g(cara, virar) = coroa; g(coroa, virar) = cara; Diagrama de estados:

Tabela de transio de estados:


51

Autmatos de Estados Finitos


Exemplo: Representar a soma de n com os nmeros -1, 0 e 1, indicando se aps a soma o nmero resultante par ou impar. Considere que inicialmente n = 0. O autmato AF = ({par,impar}, par, {par, impar}, {-1, 0, 1}, G) Com as seguintes transies de estado definidas em G: g(par, -1) = impar; g(par, 0) = par; g(par, 1) = impar; g(impar, -1) = par; g(impar, 0) = impar; g(impar, 1) = par;

Tabela de transio de estados Diagrama de estados


52

Autmatos de Estados Finitos


Dizemos que uma cadeia de smbolos k = k1k2...kn, com n 0, reconhecida por um autmato finito AF, quando a execuo do algoritmo abaixo deixa o autmato em um estado final:
Incio_Algoritmo e = estado_Inicial; i = 1; Enquanto no chegar ao final da cadeia k Ler o smbolo k[i] da cadeia k; e = Aplicar a Transio (e, k[i])); i = i + 1; Fim_Enquanto Se e for um estado_Final A cadeia foi reconhecida; Seno A cadeia no foi reconhecida; Fim_Se Fim_Algoritmo

53

Autmatos de Estados Finitos


Exemplo: Dado o autmato

A)O mesmo reconhece as cadeias de zeros e uns terminadas em 1 como 11001011:

B) O mesmo no reconhece as cadeias de zeros e uns terminadas em 0 como 11001010:


54

Autmatos de Estados Finitos


Exemplo: Dado o autmato AF = ({S0, S1, S2, S3}, S0, {S0}, {0,1}, G) com G: g(S0,0) = S2 g(S1,0) = S3 g(S2,0) = S0 g(S3,0) = S1 g(S0,1) = S1 g(S1,1) = S0 g(S2,1) = S3 g(S3,1) = S2 Este autmato reconhece cadeias cadeias com quantidades pares de zeros e uns como: 0011 000011 101000 0101010001 11100010
55

Autmatos como Reconhecedores de Sentenas


Dada a gramtica abaixo, <declarao> ::= <tipo> <varivel > ; | <tipo> <listaVariveis> ; <listaVariveis> ::= <varivel> | <varivel> , <listaVariveis> <varivel> ::= <identificador> | <identificador> [<nmero>] <tipo> ::= int | float | char < identificador > ::= { a,b,c,..., z }+ < nmero > ::= { 0,1,2,..., 9 }+ Desenhar uma mquina de estado (autmato) para reconhecer sentenas do tipo: int alfa, beta, gama; char letra, palavra[10]; float delta[20], omega;
56

Autmatos como Reconhecedores de Sentenas


1: Crie a lista de cdigos de tokens Token Cdigo ; 1 , 2 [ 3 ] 4 int 5 float 6 char 7 id 8 (identificador) num 9 (nmero) 2: Considerando cada cdigo como sendo um estado, defina os estados finais. Os estados finais so os elementos finalizadores de uma sentena vlida. Neste caso, ; e portanto o estado final 1

57

Autmatos como Reconhecedores de Sentenas


3: Com base na gramtica e nos estados identifique as transies.

Transies: g(0, int) = 5 g(5, id) = 8 g(8, ,) = 2 g(8, [) = 3 g(4, ,) = 2

g(0, float) = 6 g(0, char) = 7 g(6, id) = 8g(7, id) = 8 g(2, id) = 8 g(8, ;) = 1 g(3, num) = 9 g(9, ]) = 4 g(4, ;) = 1

58

Autmatos como Reconhecedores de Sentenas


4: Com base nas transies, crie a tabela de transio de estados: g(0, int) = 5 g(0, float) = 6 g(0, char) = 7 g(5, id) = 8 g(6, id) = 8 g(7, id) = 8 g(8, ,) = 2 g(2, id) = 8 g(8, ;) = 1 g(8, [) = 3 g(3, num) = 9 g(9, ]) = 4 g(4, ,) = 2 g(4, ;) = 1

Observao: Transies no previstas levam a um estado de erro.

59

Autmatos como Reconhecedores de Sentenas


5: Otimize a tabela de transio de estados: Os estados 2, 5, 6 e 7 sofrem uma transio para 8 na presena de id e transio para E na presena dos demais smbolos da gramtica.

60

Autmatos como Reconhecedores de Sentenas


Portanto, a tabela de transio de estados poderia ser simplificada para:

E as novas transies seriam: g(0, int) = x g(0, float) = x g(0, char) = x g(8, ,) = x g(x, id) = 8g(8, ;) = 1 g(8, [) = 3 g(3, num) = 9 g(9, ]) = 4 g(4, ,) = x g(4, ;) = 1

g(x, id) = 8

61

Autmatos como Reconhecedores de Sentenas


6: Construir o autmato:

As transies para o estado de erro no esto desenhadas

62

Autmatos Como Reconhecedores de Sentenas


Dizemos que uma sentena S, formada pelas palavras (smbolos) da gramtica (ou linguagem) L, reconhecida por um autmato finito AF, quando a execuo do algoritmo abaixo deixa o autmato em um estado final:
Incio_Algoritmo e = estado Inicial; Posicionar ponteiro de leitura no incio da primeira palavra; Enquanto no chegar ao final da sentena S Ler a palavra p da sentena S; e = Aplicar a Transio (e, p); Posicionar ponteiro de leitura no incio da prxima palavra; Fim_Enquanto Se e for um estado_Final A sentena foi reconhecida; Seno A sentena no foi reconhecida; Fim_Se Fim_Algoritmo

63

Compiladores - Introduo
O compilador um software de sistema cujo papel traduzir programas em linguagens de alto nvel (programa fonte), para linguagens de mquina (programa objeto).

O processo de traduo envolve duas tarefas bsicas: Anlise: o texto de na linguagem fonte avaliado e os erros so identificados, e Sntese: em que a sada em linguagem objeto gerado.
64

Compiladores - Introduo
A tarefa de anlise dependente da linguagem fonte a ser traduzida (C, Pascal, C++, etc). A tarefa de sntese tem uma ligao estreita c/ o hardware e dependente da linguagem de mquina. Para manter uma independncia entre as duas fases, um cdigo intermedirio gerado pela tarefa de anlise.

65

Compiladores - Fases
As tarefas de anlise e sntese podem ser subdivididas nas seguintes fases: Anlise lxica Anlise sinttica Anlise Anlise semntica Gerao de cdigo intermedirio Otimizao de cdigo Sntese Gerao de cdigo objeto E o compilador pode ser visto como sendo formado por um conjunto de componentes, de modo que cada fase seja executada por um componente.

66

Compiladores - Componentes
Portanto, um compilador seria constitudo pelos seguintes componentes: Analisador lxico Analisador sinttico Analisador semntico Gerador de cdigo intermedirio Otimizador de cdigo Gerador de cdigo objeto Alm dos componentes acima, o compilador tambm possui um gerenciador da tabela de smbolos. A tabela de smbolos uma estrutura de dados contendo um registro para cada nome de varivel, com campos para os atributos desse nome, como por exemplo: tipo, escopo, 67 endereo.

Anlise Lxica
A anlise lxica, tambm chamada de varredura, feita pelo analisador lxico. O analisador l cada caractere que compe o programa fonte agrupando-os em sequncias chamadas lexemas ou marcas (tokens, em ingls). Cada lexema representa uma unidade de informao do programa fonte. So exemplos de lexemas: Palavras reservadas: if, for, while, else, char. Identificadores: nomes de variveis e de constantes. Smbolos especiais: + - * / Valores numricos: 100 5.67 -76 A anlise lxica usa autmatos finitos para reconhecer os lexemas.
68

Anlise Lxica (continuao...)


A anlise lxica ocorre por demanda do analisador sinttico. O analisador sinttico solicita, ao analisador lxico, a leitura do prximo lexema atravs da chamada de uma funo do tipo: tipoToken GetNextToken(); Os lexemas podem ser declarados como um tipo enumerado: typedef enum { IF, ELSE, WHILE, FOR, ....} tipoToken; A funo GetNextToken() deve retornar o tipo do prximo lexema de uma linha de cdigo, como por exemplo: Os tipos retornados poderiam ser: TIPO, ID, VG, ID, ACOL, NUM, FCOL, PTVG Durante a anlise lxica, alm do tipo do lexema, alguns analisadores tambm retornam a sua posio na linha. 69

A Linguagem C- (SEMENOS)
<programa> ::= <lista-decl> <lista-decl>::= <lista-decl> <decl> | <decl> <decl> ::= <decl-var> | <decl-funo> <decl-var> ::= <tipo> ID; | <tipo> ID [ NUM ]; <tipo> ::= int | <tipo-fun> ::= int | void <decl-funo> ::= <tipo-fun> ID (<parmetros>) <bloco-decl> <parmetros> ::= <lista-parmetros> | void <lista-parmetros>::= <lista-parmetros>, <parmetro> | <parmetro> <parmetro>::= <tipo> ID | <tipo> ID [ ] <bloco-decl> ::= { <decl-locais> <lista-comandos> } <decl-locais> ::= <decl-locais> <decl-var> | <lista-comandos> ::= <lista-comandos> <comando> |
70

A Linguagem C- (SEMENOS) (Continuao) <comando> ::= <decl-expresso>| <bloco-decl> | <decl-seleo> <decl-iterao> | <decl-retorno> <decl-expresso> ::= <expresso> ; | ; <decl-seleo>::= if ( <expresso ) <comando> | if ( <expresso ) <comando> else <comando> <decl-iterao>::= while ( <expresso> ) <comando> <decl-retorno> ::= return ; | return <expresso> ; <expresso> ::= <var> = <expresso-simples> | <expresso-simples> <var> ::= ID | ID [ <expresso> ] <expresso-simples> ::= <expresso-soma> <relacional> <expressosoma> 71 | <expresso-soma>

A Linguagem C- (SEMENOS) (Continuao)


<expresso-soma> ::= <expresso-soma> <soma> <termo> | <termo> <soma> ::= + | <termo> ::= <termo> <mult> <fator> | <fator> <mult> ::= * | / <fator> ::= ( <expresso> ) | <var> | <ativao> | NUM <ativao> ::= ID ( <args> ) <args> ::= <lista-arg> | l <lista-arg> ::= <lista-arg> , <expresso> | <expresso>

72

A Linguagem C- (SEMENOS) (Continuao)


Palavras Reservadas da Linguagem: Palavra Mnemnico else ELSE if IF int INT void VOID while WHILE return RETURN Cdigo 0 1 2 3 4 5

73

A Linguagem C- (SEMENOS) (Continuao)


Smbolos especiais: Smbolo Mnemnico Cdigo + MAIS 6 MENOS 7 * VEZES 8 / DIVIDIDO 9 < MENOR 10 <= MENORIGUAL 11 > MAIOR 12 >= MAIORIGUAL 13 == IGUAL 14 != DIFERENTE 15 = ATRIBUICAO 16 ; PTOVIRGULA 17 , VIRGULA 18

74

A Linguagem C- (SEMENOS) (Continuao)


Smbolos especiais: Smbolo Mnemnico ( APARENTESIS ) FPARENTESIS [ ACOLCHETE ] FCOLCHETE { ACHAVE } FCHAVE Cdigo 19 20 21 22 23 24 Cdigo 25 26
75

Marcadores: Smbolo e Mnemnico Significado ID {a,b,c, ...,z,A,B,C,...,Z}+ NUM { 0, 1 ,2, ..., 9 }+

A Linguagem C- (SEMENOS) (Continuao)


Comentrios: /* Esto inseridos entre estes smbolos */ Um comentrio deve estar contido em uma nica linha. Um comentrio pode aparecer antes ou depois de uma instruo (na mesma linha que a instruo). No so permitidos comentrios aninhados. Smbolo e Mnemnico Cdigo COMENTARIO 27 Funes Auxiliares : /* Para lr um valor inteiro via teclado */ int input(void) {...} /* Para escreve na console o valor de x */ void output(int x) {...} Observaes: Existe diferena entre caixa alta e caixa baixa. 76

Projeto de Compilador para a Linguagem CDefinio do tipo de dados tipoToken (arquivo auxiliar.h)
typedef enum { /*Palavras reservadas*/ ELSE, IF, INT, VOID, WHILE, RETURN, /*Operadores aritmticos*/ MAIS, MENOS, VEZES, DIVIDIDO, /*Operadores relacionais*/ MENOR, MENORIGUAL, MAIOR,MAIORIGUAL, IGUAL, DIFERENTE, /*Smbolos especiais*/ ATRIBUICAO, PTOVIRGULA, VIRGULA, APARENTESIS, FPARENTESIS, ACOLCHETE, FCOLCHETE, ACHAVE, FCHAVE, /*Identificadores, Nmeros e Comentrios*/ ID, NUM, COMENTARIO, /*Controles*/ ERRO, FIMARQ } tipoToken;

77

Projeto do Analisador Lxico


//Definio de constantes e variveis globais #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif /* Quantidade de palavras reservadas */ #define QTD_PALAVRAS_RESERVADAS 6 /* Tamanho mximo permitido para um token */ #define MAX_TOKEN_LEN 40 /* String para armazenar o lexema associado ao mnemnico char tokenString[MAX_TOKEN_LEN +1]; /* Funo que l o prximo token da linha de comando */ tipoToken getNextToken(void) /* Funo que l o prximo caractere da linha de comando */ char getNextChar(void)
78

Projeto do Analisador Lxico


/* Estrutura de um registro da tabela de palavras reservadas */ struct palavraReservada { char* str; tipoToken tipo; }PalavraReservada; /*Tabela de palavras reservadas */ struct palavraReservada tabelaPalavrasReservadas[] = { {"else",ELSE}, {"if",IF}, {"int",INT}, {"void",VOID}, {"while",WHILE}, {"return",RETURN} };

79

Projeto do Analisador Lxico


Autmato para validao dos marcadores ID e NUM: Valor de Retorno: ID

Valor de Retorno: NUM

80

Projeto do Analisador Lxico


Autmato para validao de comentrios:

Valor de retorno: COMENTARIO Exerccio Avaliado: 1) Desenhar um autmato para reconhecimento dos operadores relacionais.
81

Projeto do Analisador Lxico


Autmato para validao de comentrios, ID, NUM e /:

82

Projeto do Analisador Lxico


Autmato para validao dos operadores relacionais e de atribuio:

83

Projeto do Analisador Lxico


Autmato para validao dos operadores aritmticos e dos separadores , ; [ ] ( ) { }

84

Projeto do analisador lxico: Algoritmo de validao de comentrios, ID,NUM e / char c; tipoToken token; int estado, tokenStringIndex = 0; estado = 0; while(estado != 4) { c = getNextChar(); /* leitura do prximo caractere */ switch(estado) { case 0: if(isdigit(c)) /* Se c for um algarismo (0..9) */ estado = 6; else if(isalpha(c)) /* Se c for um caractere (a...z, A...Z) */ estado = 5; else if(c == /) estado = 1; else if(c == ) estado = 0; else { estado = 11; /* estado de erro, por enquanto*/ token = ERRO; } 85 break;

Projeto do analisador lxico Algoritmo para validao de comentrios, ID, NUM e /


case 1: if(c == *) estado = 2; else { estado = 4; token = DIVIDE; } break; case 2: if(c == *) estado = 3; break; case 3: if(c == /) estado = 4; token = COMENTARIO; else if(c == *) estado = 3; else estado = 2; break;
86

Algoritmo para validao de comentrios, ID, NUM e / case 5: if( !(isalpha(c)) ) { estado = 4; token = ID; } break; case 6: if( !(isdigit(c)) ) { estado = 4; token = NUM; } break;

Projeto do analisador lxico

Exerccio Avaliado: Completar o algoritmo com a validao de operadores relacionais e do operador de atribuio. Fazer com que o contedo do lexema seja armazenado em tokenString.
87

Projeto do analisador lxico


Tabela de Palavras Reservadas //Estrutura dos registros da tabela struct palavraReservada { char* str; tipoToken tipo; };

//Tabela de palavras reservadas struct palavraReservada tabelaPalavrasReservadas[] = { {"else",ELSE}, {"if",IF}, {"int",INT}, {"void",VOID}, {"while",WHILE}, {"return",RETURN} };

88

Anlise Sinttica
A anlise sinttica feita pelo analisador sinttico. O analisador solicita ao analisado lxico cada tipo de lexema (usando getNextToken()) que compe o programa fonte e testa-os nas produes da linguagem. Por exemplo, uma declarao de varivel em C- pode ser representada pelo grafo sinttico abaixo:

E assim, int alfa; e int beta[10]; seriam reconhecidas como declaraes de variveis da linguagem C- pelo algoritmo do prximo slide.

89

Anlise Sinttica com o uso de autmatos AFD


#define ERRO 7 estado = 0; status = true; while((estado != 6) && estado != ERRO) ) { token = getNextToken(); //ativao do analisador lxico switch(estado) { case 0: if(token == INT) estado = 1; else estado = ERRO; break; case 1: if(token == ID) estado = 2; else estado = ERRO; break; case 2: if(token == PTOVIRGULA) estado = 6; else if(token == ACOLCHETE) estado = 3; else estado = ERRO; break; case 3: if(token ==NUM) estado = 4; else estado = ERRO; break; case 4: if(token ==FCOLCHETE) estado = 5; else estado = ERRO; break; case 5: if(token ==PTOVIRGULA estado = 6; else estado = ERRO; break; } if(estado == 6) printf(O comando uma declarao de varivel); else printf(O comando no uma declarao de varivel);

90

Projeto do Analisador Sinttico


Exerccio avaliado 1 - Criar todos os grafos sintticos da linguagem C2 Usando os grafos sintticos, crie um autmato AFD para validar sentenas do tipo <decl-var> na linguagem C-. Use o scanner fornecido pelo professor para fazer a leitura dos lexemas. O uso de autmatos AFD para anlise sinttica s pode ser aplicado em linguagens simples (ou trechos de linguagem) que permitem grafos sintticos gerados apenas pelos smbolos da linguagem. Como no caso da linguagem C- no conseguimos fazer com que todos os grafos sintticos sejam representados por smbolos da linguagem, no podemos usar autmatos AFD para a anlise sinttica..
91

Grafo Sinttico da Linguagem C-

<bloco-decl>

Como a declarao de comando em C- possui recurso implcita (boco-decl usa comando que pode ser bloco decl), no possvel obter um grafo sinttico constitudo apenas pelos smbolos da linguagem.

92

Anlise Sinttica Descendente Recursiva


No mtodo descendente recursivo bsico, a regra gramatical para um noterminal uma definio de procedimento para reconhecer esse noterminal. Por exemplo, dada a linguagem abaixo: <exp> ::= <exp> + <termo> | <termo> <termo> ::= <termo> * <fator> | <fator> <fator> ::= ( <exp> ) | NUM Podemos construir os seguintes algoritmos para as regras da linguagem: 1 ValidarToken(tipoToken tipo) 2{ 3 Se (token = tipo) 4 token = LerNovoToken() 5 Seno 6 token = ERRO 7 Fim_Se 8}
93

Anlise Sinttica Descendente Recursiva


9 AnalisadorSintatico() 10 { 11 token = LerNovoToken() 12 //Chamar a regra que inicia as sentenas da linguagem 13 Exp() 14 Se Token = FIMARQ // o Arquivo foi lido at o final 15 Imprimir(expresso vlida) 16 Seno 17 Imprimir(expresso invlida) 18 Fim_Se 19 } 20 Exp() 21 { 22 Termo() //Ativar regra <termo> 23 Enquanto (token = MAIS) 24 token = LerNovoToken() 25 Termo() //Ativar regra <termo> 26 Fim_Enquanto 27 }

94

28 Termo() 29 { 30 Fator() //Ativar regra <fator> 31 Enquanto (token = VEZES) 32 token = LerNovoToken() 33 Fator() //Ativar regra <fator> 34 Fim_Enquanto 35 } 36 Fator() 37 { 38 Caso token = APARENTESIS 39 token = LerNovoToken() 40 Exp() //Ativar regra <exp> 41 ValidarToken(FPARENTESIS) 42 Caso token = NUM 43 token = LerNovoToken() 44 Caso contrrio 45 token = ERRO 46 Fim_caso 47 }

Anlise Sinttica Descendente e Recursiva

95

Exerccio ( fazer para os alunos acompanharem) Simular a execuo do algoritmo do analisador sinttico anterior, no reconhecimento da sentena: 12 + 31 * ( 45 + 10) Situao aps a leitura do primeiro token e chamada da funo EXP. Funo AnalisadorSintatico Exp Token Lido NUM Linha de Retorno 14 Lexema 12
96

Anlise Sinttica Descendente Recursiva

Exerccio Avaliado: Simular a execuo do algoritmo do analisador sinttico anterior, no reconhecimento da sentena: ( (12 * 31) + (45 * 10 ) )

Anlise Sinttica Descendente Recursiva

As rotinas construdas a partir de grafos sintticos do tipo ou

Observao Importante

Devem conter testes que possibilitem a escolha inequvoca do caminho a ser percorrido.
97

Projeto do Analisador Sinttico C (Algoritmos)


AnalisadorSintatico() { ListaDecl(); if (token == FIMARQ) // o Arquivo foi lido at o final printf(Programa validado); else printf(Programa contm erro); } Obs: O analisador reconhece como vlido um programa sem nenhuma linha de comando. ListaDecl() { token = getNextToken(); while ((token == INT) || (token == VOID)) Decl(); }

98

Decl() { int temp; temp = posicaoLeitura; if(token == VOID) DeclFuncao(); else //Pesquisar frente { showToken = 0; token = getNextToken(); ValidarToken(ID); if(token == APARENTESIS) { showToken = 1; posicaoLeitura = temp; // restaura situao de entrada token = INT; // restaura token da entrada DeclFuncao(); }
99

....continua

...continuao Decl()

else if((token == ACOLCHETE)||(token == PTOVIRGULA)) { showToken = 1; posicaoLeitura = temp; // restaura situao de entrada token = INT; // restaura token da entrada DeclVar(); } else { token = ERRO; showToken = 1; }

100

DeclVar() { Tipo(); ValidarToken(ID); if(token == ACOLCHETE) { token = getNextToken(); ValidarToken(NUM); ValidarToken(FCOLCHETE); } ValidarToken(PTOVIRGULA); } Tipo() { ValidarToken(INT); } OBS: O uso da funo ValidarToken torna os algoritmos mais intuitivos, porm menos eficientes.
101

DeclFuncao() { TipoFunc(); ValidarToken(ID); ValidarToken(APARENTESIS); Parametros(); ValidarToken(FPARENTESIS); BlocoDecl(); } TipoFunc() { if((token == INT)||(token == VOID)) token = getNextToken(); else token = ERRO; }

102

Parametros() { if(token == VOID) token = getNextToken; else if(token == INT) ListaParametros(); else token = ERRO; } ListaParametros() { do { Parametro(); if(token == VIRGULA) token = getNextToken(); else break; }while(1); }

103

Parametro() { ValidarToken(INT); ValidarToken(ID); if(token == ACOLCHETE) { token = getNextToken(); ValidarToken(FCOLCHETE); } }

104

BlocoDecl() { if(token == ACHAVE) { token = getNextToken(); DeclLocais(); ListaComandos(); ValidarToken(FCHAVE); } else token = ERRO; } DeclLocais() { while(token == INT) DeclVar(); }

105

ListaComandos() { //Enquanto for um tokem inicial de comando while((token == ACHAVE) || (token == IF) || (token == WHILE) || (token == RETURN) || (token == ID) || (token = NUM) || (token == APARENTESIS) || (token == PTOVIRGULA)) { Comando(); // vai sem ler novo token } }

106

Comando() { switch(token) { case ACHAVE : BlocoDecl(); // # break; case IF : DeclSelecao(); // # vai sem ler novo token break; case WHILE : DeclIteracao(); // vai sem ler novo token break; case RETURN : DeclRetorno(); // vai sem ler novo token break; case PTOVIRGULA: // ; de <decl-expresso case APARENTESIS: // ( de <fator> case NUM : // NUM de <fator> case ID : DeclExpressao(); // ID de <var> e <ativao> # break; default : token = ERRO; } 107 }

DeclExpressao() { //Se token inicia Expresso if(token != PTOVIRGULA) Expressao(); //sem chamar novo token ValidarToken(PTOVIRGULA); } Var() { ValidarToken(ID); if(token == ACOLCHETE) { token = getNextToken(); Expressao(); ValidarToken(FCOLCHETE); } }
108

Expressao() { int temp; temp = posicaoLeitura; if((token == APARENTESIS)||(token == NUM)) // expresso-simples ExpressaoSimples(); //Sem chamar novo token else if(token == ID) //Pode ser expresso-simples ou var { showToken = 0; token = getNextToken(); if((token == ATRIBUICAO)||(token == ACOLCHETE)) // var { showToken = 1; posicaoLeitura = temp; //restaura ponteiro de leitura token = ID; //restaura token Var(); ValidarToken(ATRIBUICAO); ExpressaoSimples(); }
109

...continua....

...continuao....Expressao() else { // expresso simples comeando com ID showToken = 1; posicaoLeitura = temp; //restaura ponteiro de leitura token = ID; //restaura token ExpressaoSimples();

} else }

token = ERRO;

110

Algoritmos do Analisador Sinttico

DeclSelecao() { ValidarToken(IF); ValidarToken(APARENTESIS); Expressao(); ValidarToken(FPARENTESIS); Comando(); if(token == ELSE) token = getNextToken(); Comando(); }

111

Algoritmos do Analisador Sinttico

DeclIteracao() { ValidarToken(WHILE); ValidarToken(APARENTESIS); Expressao(); ValidarToken(FPARENTESIS); Comando(); } DeclRetorno() { ValidarToken(RETURN); if(token != PTOVIRGULA) Expressao(); ValidarToken(PTOVIRGULA); }

112

ExpressaoSimples() { ExpressaoSoma(); //Sem chamar novo token if( (token == MAIOR) || (token == MAIORIGUAL) || (token == MENOR) || (token == MENORIGUAL) || (token == IGUAL) || (token == DIFERENTE)) { token = getNextToken(); ExpressaoSoma(); } } ExpressaoSoma() { Termo(); while((token == MAIS) || (token == MENOS)) { token = getNextToken(); Termo(); } }

113

Termo() { Fator(); while((token == VEZES) || (token == DIVIDIDO)) { token = getNextToken(); Fator(); } } Ativacao() { ValidarToken(ID); ValidarToken(APARENTESIS); Args(); ValidarToken(FPARENTESIS); }
114

Fator() { int temp; temp = posicaoLeitura; switch(token) { case APARENTESIS: token = getNextToken(); // ( <expresso> ) Expressao(); ValidarToken(FPARENTESIS); break; case NUM: token = getNextToken(); // NUM break; case ID: showToken = 0; token = getNextToken(); if(token == APARENTESIS) // ativao { showToken = 1; posicaoLeitura = temp; token = ID; Ativacao(); 115 } ....continua.....

...continuao Fator() else // <var> { showToken = 1; posicaoLeitura = temp; token = ID; Var(); } break; token = ERRO; showToken = 1; break;

default: }

116

Args() { if((token == APARENTESIS)||(token == NUM)||(token== ID)) ListaArg(); } ListaArg() { do { Expressao(); if(token == VIRGULA) token = getNextToken(); else break; }while(1); }
117

Projeto do Analisador Sinttico C


Testar os algoritmos usando o programa Compilador fornecido pelo professor. -Simule situaes corretas e com erro; -Avalie a resposta dada pelo programa; -Identifique discrepncias entre o esperado e o obtido.

118

Converso de Bases - Reviso


Converso de Decimal para Binrio (mtodo da Diviso) 4710 = X2 ? 47 / 2 = 23, 23 / 2 = 11, 11 / 2 = 5, 5 / 2 = 2, 2 / 2 = 1, 1 / 2 = 0, resto resto resto resto resto resto = = = = = = 1 1 1 1 0 1

Portanto, 4710 = 1011112

119

Converso de Bases - Reviso


Converso de Decimal p/ Hexadecimal (mtodo da Diviso) 16810 = X16 ? 168 / 16 = 10, 10 / 16 = 0, resto = 8 resto = 10 816 = 8 1016 = A

Portanto, 16810 = A816 156910 = X16 ? 1569 / 16 = 98, 98 / 16 = 6, 6 / 16 = 0, resto = 1 resto = 2 resto = 6 116 = 1 216 = 2 616 = 6
120

Portanto, 1569 = 621

Computador Simplificado de Instruo Arquitetura do computador CSI Memria A mmria do computador CSI constituida por 32.768 bytes (215 ) contguos. Cada 3 bytes consecutivos formam uma palavra (word) de 24 bits. Um endereo corresponde posio de um determinado byte na memria. Palavras (words) so endereadas pela localizao do byte mais esquerda.

Arquitetura do Computador CSI

121

Computador Simplificado de Instruo - Arquitetura Registradores Existem 5 registradores de 24 bits (uma palavra) no CSI:
Mnemnico A X L Nmero 0 1 2 Utilizao Acumulador, usado para operaes aritmticas. Registrador de ndices, usado para endereamento. Registrador de ligao (linkage register). A instruo JSUB ( chamada de subrotina) guarda o endereo de retorno neste registrador. Contador do programa (program counter). Contm o endereo da prxima instruo a ser executada. Palavra de estado (status word). Contm uma variedade de informaes, inclusive o Cdico de Condio (Condition Code) CC.
122

Arquitetura do Computador CSI

PC SW

8 9

Computador Simplificado de Instruo Formato de Dados Caracteres ASCII em representao hexadecimal. - Dgitos 0..9 : cdigo ASCII de 30 a 39 - Letras Maisculas A..Z: cdigo ASCII de 41 a 5A - Letras Minsculas a..z: cdigo ASCII de 61 a 7A Modos de Endereamento Todas as instrues tm 24 bits (uma palavra) e possuem o seguinte formato:

Arquitetura do Computador CSI

Obs: x usado para indicar o modo de endereamento


123

Computador Simplificado de Instruo O computador CSI possui dois modos de endereamento indicados pela flag x: modo DIRETO e modo Indexado. O endereo final TA (target adress) calculado a partir do endereo da instruo: Modo Indicao Clculo do Endereo Direto x=0 TA = endereo Indexado x=1 TA = endereo + (X) Obs: (X) representa o contedo do registrador de ndices X Exemplo de instruo em modo direto ADD ALFA 00011000 00000000 00001111 Significado dessa instruo: Some o valor contido no endereo de ALFA (15) com o contedo do acumulador (registrador A).

Arquitetura do Computador CSI

124

Computador Simplificado de Instruo Exemplo de instruo em modo indexado: LDA BETA, X 00000000 10000000 00001111 Significado dessa instruo: Carregar o acumulador (registrador A) com o contedo do endereo (BETA + (X)) Se o registrador X estiver carregado com (X) = 00000000 00000000 00001010 O endereo final (TA) ser dado por : endereo base 00000000 00001111 (X) 00000000 00001010 TA 00000000 00011001

Arquitetura do Computador CSI

125

Conjunto de Instrues do Computador CSI


Computador Simplificado de Instruo Efeito 18 40 28 24 3C 30 34 38 48 00 50 08 Mnemnico OpCode ADD m AND m COMP m DIV m Jm JEQ m JGT m JLT m JSUB m LDA m LDCH m LDL m Nota

A <-- (A) + ( m..m + 2) A <-- (A) & ( m..m + 2) (A) : (m..m + 2) C A <-- (A) / (m..m + 2) PC <-- m PC <-- m se CC indicar = PC <-- m se CC indicar > PC <-- m se CC indicar < L <-- (PC); PC <-- m A <-- (m..m + 2) A[ byte mais direita] <-- (m) L <-- (m..m + 2)
126

Conjunto de Instrues do Computador CSI


Computador Simplificado de Instruo Efeito X <-- (m..m + 2) A <-- (A) * (m..m + 2) A <-- (A) | (m..m + 2) continuao... Mnemnico OpCode LDX m MUL m OR m RD m RSUB STA m STCH m STL m STSW m STX m SUB m 04 20 44 D8 4C 0C 54 14 E8 10 1C Nota

A[byte mais direita] <-- dados do

dispositivo especificado por (m) P PC <-- (L) m..m + 2 <-- (A) m <-- (A) [byte mais direita] m..m + 2 <-- (L) m..m + 2 <-- (SW) P m..m + 2 <-- (X) A <-- (A) (m..m + 2) 127

Computador Simplificado de Instruo continuao... Mnemnico OpCode Efeito TD m TIX m WD m

Conjunto de Instrues do Computador CSI

Nota

E0 Testa dispositivo especificado por (m) P, C 2C X <-- (X) + 1; (X) : (m..m + 2) C DC Dispositivo (m) <-- (A) [byte mais direita] P

OBSERVAES: 1) As letras na coluna Nota tm o seguinte significado: C : a instruo seta o cdigo de condio CC usado p/ indicar o resultado da operao (<, =, >); P : a instruo uma instruo privilegiada. 2) Parntesis so usados para indicar o contedo de uma posio de memria ou registrador. Por exemplo (A) indica o contedo do registrador A; (m..m + 2) indica o contedo das posies de memria m at m+2; 3) m..m + 2 <-- (A) especifica que o contedo do registrador A armazenado na palavra que comea no endereo m.

128

Computador CSI
Diretivas da Linguagem Assembler do CSI START Especifica o nome e o endereo inicial do programa. END BYTE Indica o final do programa fonte e (opcionalmente) especifica a primeira instruo executvel do mesmo. Gera um caractere ou constante hexadecimal neste ltimo caso, ocupa tantos bytes quanto necessrio para representar a constante. WORD Gera uma constante inteira com o tamanho de uma RESB RESW palavra 24 bits. Reserva uma rea de memria com o tamanho correspondente ao nmero de bytes indicado. Reserva uma rea de memria com o tamanho correspondente ao nmero de palavras indicado.
129

Computador CSI Exemplos de Programao Assembler Movimentao de Dados Como no existem instrues para movimentar dados diretamente na memria do computador a movimentao deve ser feita atravs dos registradores. No exemplo, para mover a constante FIVE para a varivel ALFA, utilizado o acumulador A, entretanto poderiam ser utilizados tanto o registrador X (LDX, STX) como o registrador L ( LDL, STL). Para mover a letra 'Z' para a varivel C1 o exemplo utiliza as instrues LDCH e STCH. Estas instrues operam sobre o byte mais direita do registrador A no afetando os demais bytes.

130

Computador CSI Exemplos de Programao Assembler Label Instruo Operando LDA STA LDCH STCH ALFA RESW FIVE WORD CHARZ BYTE C1 RESB FIVE ALFA CHARZ C1 1 5 CZ 1 Comentrio Registrador A constante 5 ALFA (A) Registrador A caractere Z Varivel caractere C1 (A) Reserva 3Bytes p/a varivel ALFA Define a constante FIVE do tipo WORD e atribui mesma o valor 5 Define a constante CHARZ do tipo BYTE e atribui mesma o caractere Z Reserva 1 byte para a varivel C1

131

Computador CSI Exemplos de Programao Assembler


Operaes Aritmticas As operaes matemticas usam o acumulador A, que retm o resultado das operaes. O exemplo armazena o valor (ALFA + INCR - 1) em BETA e o valor (GAMA + INCR - 1) em DELTA. Label Instruo Operando Comentrio LDA ALFA Carrega o registrador A com a varivel ALFA ADD INCR Adiciona o valor de INCR SUB ONE Subtrai 1 STA BETA Guarda o resultado na varivel BETA LDA GAMA Carrega a varivel GAMA no registrador A ADD INCR Adiciona o valor de INCR SUB ONE Subtrai 1 STA DELTA Guarda o resultado na varivel DELTA ONE WORD 1 Define a constante ONE do tipo WORD e atribui mesma o valor 1 ALFA RESW 1 Reserva 3 bytes para a varivel ALFA BETA RESW 1 Reserva 3 bytes para a varivel BETA GAMA RESW 1 Reserva 3 bytes para a varivel GAMA DELTA RESW 1 Reserva 3 bytes para a varivel DELTA 132 INCR RESW 1 Reserva 3 bytes para a varivel IINCR

Computador CSI Exemplos de Programao Assembler 'Looping' e Indexao com a Instruo TIX
O exemplo a seguir copia uma 'string' de 5 caracteres (STR1) para outra 'string' (STR2). O registrador de ndices X inicializado com o valor zero, assim, na primeira passagem pelo 'loop' o endereo final (STR1 + X) para a instruo LDCH ser o endereo do primeiro byte da 'string' STR1. Similarmente, a instruo STCH armazenar o caractere copiado na primeira posio da 'string' STR2. A seguir a instruo TIX incrementa 1 ao valor do registrador X e compara o resultado com o tamanho da 'string' ( fornecido pelo operando CINCO). O resultado dessa comparao guardado no cdigo de condio CC para posterior uso pela instruo JLT. A instruo JLT testa o cdigo de condio CC. Se este contiver a informao '<' ento o endereo de salto MOVECH colocado no registrador PC, provocando o retorno para a leitura de um novo caractere.

133

Computador CSI Exemplos de Programao Assembler 'Looping' e Indexao com a Instruo TIX
Instruo Operando LDX ZERO MOVECH LDCH STR1, X STCH STR2, X TIX CINCO JLT MOVECH STR1 BYTE C'TESTE' STR2 ZERO CINCO RESB WORD WORD 5 0 5 Label Comentrio Inicia o registrador de ndices com 0 Carrega em A o caractere de STR1[X] Armazena o caractere em STR2[X] Soma 1 ao ndice e compara-o com 5 Se ndice < 5 salta para MOVECH Define uma constante do tipo caractere, com 5 bytes e contedo 'TESTE' Reserva 5 bytes para a varivel STR2 Define a constante ZERO (c/ valor 0) Define a constante CINCO (c/ valor 5)

134

Computador CSI Exemplos de Programao Assembler 'Looping' e Indexao sem a Instruo TIX
Este exemplo executa a soma de dois arrays de inteiros de 100 posies, de forma que o resultado seja dado por: GAMA[i] = ALFA[i] + BETA[i] Label Instruo Operando Comentrio LDA ZERO Carrega a constante ZERO em A STA INDEX Inicia a varivel INDICE com 0 ADDLP LDX INDEX Carrega o registrador de ndices LDA ALFA, X Carrega em A o contedo de ALFA[x] ADD BETA, X Soma BETA[X] ao contedo de A STA GAMA, X Armazena em GAMA[X] o contedo de A LDA INDEX Carrega A com o contedo de INDEX ADD THREE Soma 3 ao valor contido em A STA INDEX Armazena em INDEX o novo valor COMP K300 Compara o novo ndice com 300 JLT ADDLP Se ndice < 300 salta para ADDLP continua...
135

Computador CSI Exemplos de Programao Assembler 'Looping' e Indexao sem a Instruo TIX
...continuao... Label INDEX ALFA BETA GAMA ZERO K300 THREE Instruo Operando Comentrio RESW 1 Reserva 3 bytes para INDEX RESW 100 Reserva 300 bytes para o array ALFA RESW 100 Reserva 300 bytes para o array BETA RESW 100 Reserva 300 bytes para o array GAMA WORD 0 Define a constante ZERO com valor 0 WORD 300 Define a constante K300 com o valor 300 WORD 3 Define a constante THREE com o valor 3

136

Computador CSI Exemplos de Programao Assembler Dispositivos de Entrada e Sada


Este exemplo l um byte de informao do dispositivo F1 e transfere esse byte para o dispositivo de sada 05. Label Instruo Operando Comentrio ILOOP TD IDEV Testa o dispositivo de entrada JEQ ILOOP Fica em 'loop' enquanto o dispositivo no estiver pronto RD IDEV A <-- um byte do dispositivo de entrada STCH DATA O byte armazenado na varivel DATA .... OLOOP TD ODEV Testa o dispositivo de sada JEQ OLOOP Fica em 'loop'enquanto o dispositivo no estiver pronto LDCH DATA A <-- DATA WD ODEV Escreve um byte no dispositivo de sada .... IDEV BYTE X'F1' Define o dispositivo de entrada (base 16) ODEV BYTE X'05' Define o dispositivo de sada (base 16) DATA RESB 1 Reserva um byte para a varivel DATA 137

Computador CSI Exemplos de Programao Assembler Chamada de Subrotina

Neste exemplo utilizamos uma subrotina (READ) que l um registro de 100 bytes de um dispositivo de entrada e armazena esses bytes na memria do computador. Label Instruo Operando Comentrio JSUB READ Chamada da subrotina READ .... READ LDX ZERO Inicia o registrador de ndices com 0 RLOOP TD IDEV Testa o dispositivo de entrada JEQ RLOOP Retorna para RLOOP se o dispositivo no estiver disponvel. RD IDEV L um byte de INDEV e guarda em A STCH REC, X Armazena o caractere em REC[X] TIX K100 Soma 1 ao ndice e compara-o com 100 JLT RLOOP Salta para RLOOP se ndice < 100 RSUB Retorna da Subrotina IDEV BYTE X'F1' Define o dispositivo de entrada (base 16) REC RESB 100 Reserva 100 bytes p/ dados de entrada ZERO WORD 0 Define a constante ZERO com valor 0 138 K100 WORD 100 Define a constante K100 com valor 10

Gerao de Cdigo em Linguagem da Mquina para o Computador CSI Os passos para converter o cdigo assembler do CSI em linguagem de mquina so: 1 converter os mnemnicos em seus equivalentes em linguagem de mquina. Por exemplo: as instrues STL, J e LDCH devem ser convertidas em 14, 3C e 50. 2 - Atribuir endereos - em hexadecimal - s instrues do programa. Cada instruo do computador CSI armazenada em uma palavra de 3 bytes. 3 - Converter os operadores simblicos nos seus respectivos endereos de mquinas. 4 - Converter as constantes do programa fonte em seus equivalentes em linguagem de mquina. Os valores sero representados em hexadecimal. 5 - Construir as instrues de mquinas. 139

Gerao de Cdigo em Linguagem da Mquina para o Computador CSI Os passos para converter o cdigo assembler do CSI em linguagem de mquina so: 1 converter os mnemnicos em seus equivalentes em linguagem de mquina. Por exemplo: as instrues STL, J e LDCH devem ser convertidas em 14, 3C e 50. Linha Instrues Opcode 5 COPY START 1000 10 FIRST STL RETADR 14 15 CLOOP JSUB RDREC 48 20 LDA LENGTH 00 25 COMP ZERO 28 30 JEQ ENDFIL 30 45 ENDFIL LDA EOF 00 50 STA BUFFER 0C 140 55 LDA THREE 00

Gerao de Cdigo em Linguagem da Mquina para o CSI 2 - Atribuir endereos - em hexadecimal - s instrues do programa. Cada instruo do computador CSI armazenada em uma palavra de 3 bytes. Linha 5 10 15 20 25 30 35 40 45 50 55 End COPY 1000 FIRST 1003 CLOOP 1006 1009 100C 100F 1012 1015 ENDFIL 1018 101B Instrues START 1000 STL RETADR JSUB RDREC LDA LENGTH COMP ZERO JEQ ENDFIL JSUB WRREC J CLOOP LDA EOF STA BUFFER LDA THREE Opcode 14 48 00 28 30 48 3C 00 0C 00
141

Gerao de Cdigo em Linguagem da Mquina para o Computador CSI Os passos para converter o cdigo assembler do CSI em linguagem de mquina so: 3 - Converter os operadores simblicos e constantes nos seus respectivos endereos de mquinas. Linha End Instrues End Mq Opcode 5 COPY START 1000 10 1000 FIRST STL 1033 14 15 1003 CLOOP JSUB 2039 48 20 1006 LDA 1036 00 25 1009 COMP 1030 28 30 100C JEQ 1015 30 35 100F JSUB 2061 48 40 1012 J 1003 3C 45 1015 ENDFIL LDA 1027 00

142

Gerao de Cdigo em Linguagem da Mquina para o Computador CSI Os passos para converter o cdigo assembler do CSI em linguagem de mquina so: 4 - Construir as instrues de mquinas. Linha Instrues End Mq & Instrues de Constantes Mquina 5 COPY START 1000 10 FIRST STL 1033 141033 15 CLOOP JSUB 2039 482039 20 LDA 1036 001036 25 COMP 1030 281030 30 JEQ 1015 301015 35 JSUB 2061 482061 40 J 1003 3C1003 45 ENDFIL LDA 1027 001027
143

Cdigo de 3 Endereos
O cdigo de 3 endereos um cdigo intermedirio que tem por objetivo facilitar a gerao de cdigo alvo. Exemplos: Comando original: alfa = (alfa + beta) (alfa * beta) Cdigo de 3 endereos: T1 = alfa + beta T2 = alfa * beta alfa = T1 T2 Cdigo em assembler construdo a partir do cdigo de 3 end. LDA alfa LDA alfa ADD beta MUL beta STA t1 STA t2 LDA alfa LDA alfa cdigo otimizado MUL beta ADD beta STA t2 SUB t2 LDA t1 STA alfa SUB t2 STA alfa

144

Cdigo de 3 Endereos
Exemplos: Comando original: alfa = alfa * beta alfa / beta Cdigo de 3 endereos: T1 = alfa * beta T2 = alfa / beta alfa = T1 T2 Cdigo em assembler construdo a partir do cdigo de 3 end. LDA alfa LDA alfa MUL beta DIV beta STA t1 STA t2 LDA alfa LDA alfa cdigo otimizado DIV beta MUL beta STA t2 SUB t2 LDA t1 STA alfa SUB t2 STA alfa
145

Referncias Bibliogrficas
[1] AHO, A. V.; LAM, M.S.; SETHI, R. e ULLMAN, J. D. Compiladores: princpios, tcnicas e ferramentas. 2a ed. So Paulo: Addison Weslley, 2008. 634p. [2] NETO, J. J. Introduo compilao. So Paulo: LTC, 1987. 222p. [3] PRICE, A.M.A.; TOSCANI, S.P. Implementao de linguagens de programao: compiladores. 3 ed. Porto Alegre: Bookman, 2008, 195p. [4] SETZER, V. W. e MELO, I. S. H. Construo de um compilador. Rio de Janeiro: Editora Campus, 1986. 325p. [5] LOUDEN, K.C. Compiladores princpios e prticas. So Paulo: Pioneira Thomson Learning, 2004. 569p. [6] FISCHER, C. N.; LEBLANC, R. J. Crafting a compiler with C. New York: Benjamin/Cummungs, 1991. 812p. [7] HOPCROFT, J. E.; ULLMAN, J. D. Introduction to automata theory, languages, and computation. Massachusetts: Assison-Weslwy Publisshing Company, 1979. 410p. [8] KELLEY, D. Automata and formal languages - an introduction. Englewood Cliffs: Prentice Hall, 1995. 240p.
146