Você está na página 1de 41

Como construir um compilador Fellipe Leonardo Madureira de Assis

Introduo
Linguagem-alvo

do compilador Linguagem mais simples, com viso completa construo de um compilador Orientada a objetos

Forma de Backus-Naur (BNF)


A Forma de Backus-Naur (BNF) uma outra maneira de se definir linguagens livres de contexto. Ela semelhante a uma gramtica livre de contexto (GLC), mas permite que o lado direito das produes possua alguns operadores.

Operadores:
o

o
o o

Seleo (A|B) Opo [A] Repetio 0 ou mais vezes (A)* Repetio 1 ou mais vezes (A)+

Exemplos
Seleo

S a( b | c | d) e
Opo

S a[b]
Repetio

0 ou mais vezes (A)*

S a(b)*c
Repetio

1 ou mais vezes (A)+

S a(b)+c

BNF para a linguagem X++


<symbol>

symbol; smbolos terminais so representados com symbol ; metassmbolos da notao BNF so representados grafados com [ ].
Informaes Smbolos terminais: no podem ser

representa o no-terminal

modificados usando as regras da gramtica

modificados usando as regras da gramtica. Exemplo: 1. x pode se tornar xa 2. x pode se tornar ax

Smbolos no-terminais: podem ser

Smbolo Inicial <program>


<program>

[ <classlist> ]

Esse no-terminal indica que um programa em X++ composto de uma lista de classes ou se trata de uma cadeia vazia.

Lista de Classes <classlist>

<classlist> ( <classdecl> )+ <classlist> <classdecl> [<classlist>]

O no-terminal classlist representa uma repetio de declaraes de classes, como num programa em Java, que basicamente composto de uma sequncia de declaraes de classes como:

class a {. . . .} class b {. . . .} .... class c {. . . .}

Declarao de classe < classdecl>

<classdecl> class ident [ extends ident ] <classbody> Esse no-terminal classdecl representa a declarao de uma classe. Ele indica que tal estrutura se inicia com a palavra reservada class que vem seguida por um identicador (outro terminal) que ir dar nome classe sendo declarada. Depois do nome da classe, pode ou no aparecer a palavra extends e o nome da superclasse da qual a classe sendo declarada descende.

class a ... ou class a extends b ...

Corpo da classe <classbody>

<classbody> { [ <classlist> ] ( <vardecl> ; ) ( <constructdecl> ) ( <methoddecl> ) }

Ele se inicia com um { que (opcionalmente) vem seguido por um no-terminal classlist, declarado anteriormente. Isso significa que a linguagem permite a declarao de classes aninhadas. Depois, seguem-se as declaraes de variveis, construtores e mtodos.

10

Corpo da classe <classbody>

<classbody> { [ <classlist> ] ( <vardecl> ; ) ( <constructdecl> ) ( <methoddecl> ) }

11

Declarao de variveis <vardecl>


<vardecl> ( int | string | ident ) ident ( [ ] ) ( , ident ( [ ] ) )

Uma declarao de variveis, representada pelo no-terminal vardecl, semelhante declarao de variveis em Java.

int a; ou string a,b; ou meutipo a[], b[] [];

12

Declarao de variveis <vardecl>

Essa produo gera cadeias que comeam com o tipo da varivel a ser declarada, que pode ser int, string, ou um identicador que o nome de uma classe declarada no prprio programa. Em seguida, vm os nomes das variveis sendo declaradas. Podem ser seguidos ou no por colchetes que indicam a dimenso de cada varivel.

13

Declarao de construtores e mtodos


<constructdecl> constructor <methodbody> <methoddecl> ( int | string | ident ) ( [ ] ) ident <methodbody> A declarao de um construtor comea com a palavra constructor. Um construtor no tem tipo de retorno ou um nome. A declarao de um mtodo inicia-se com o tipo de retorno do mtodo, que pode ou no ter vrias dimenses, seguido pelo nome do mtodo e pelo seu corpo. int[] fatorial ...

14

Declarao de construtores e mtodos


<constructdecl> constructor <methodbody> <methoddecl> ( int | string | ident ) ( [ ] ) ident <methodbody>

15

Corpo de mtodo (ou construtor)


int a int a, string b string b[][], int a, MyType c

16

Corpo de mtodo (construtor)


int[] fatorial (int x, string z) { comando 1; comando 2; ... } construtor (int x, string z) { comando 1; comando 2; ... }

17

Corpo de mtodo (ou construtor)

18

Comando <statement>
A

segunda parte do corpo do mtodo o statement e composta de um nico comando.

comando 1 comando 2 ... comando n


}

19

Comando <statement>

20

Comandos da linguagem

declarao de variveis locais; int a, b, c; comando de atribuio; a = b +c; comando de impresso; print comando de leitura; read comando de trmino do mtodo e retorno de valor; return comando de seleo; if comando de repetio; for comando de interrupo de lao; break comando composto; { ... } comando vazio. ;

21

Comando de atribuio <atribstat>

<atribstat> <lvalue> = ( <expression> | <alocexpression> ) Referncia a uma posio de memria (representada pelo no-terminal lvalue), seguida por um = e, depois, uma expresso ou uma referncia a um novo objeto, utilizando o operador new. a=0 a[10] = b + c.d a[10].b = new MyType()

22

Comando de impresso <printstat>


<printstat

> print <expression>

print 123 print a print a[10].b * c.d[e]

23

Comando de leitura <readstat>


<readstat>

read<lvalue> O lvalue representa uma refencia a uma poiso de memria, para que o camando de leitura faa sentido read a read a.b read a.b[c+2]

24

Retorno de mtodo <returnstat>


<returnstat

> return [ <expression> ] Produz cadeias correspondentes aos comandos de retorno de uma chamada de mtodo return return 0 return a + b.c

25

Chamada de super-construtor <superstat>


<superstat Nos

> super (<arglist> )

construtores pode ser utilizado tambm o comando super para chamada do construtor da superclasse.

super()

super(a, null)

26

Comando de seleo <ifstat>

<ifstat> if (<expression> ) <statement> [else <statement> ] if ( a > 0 ) read b; if (a + b == c) { read d; print d; return 0; } else return 1;

27

Comando de repetio <forstat>

<forstat> for ( [ <atribstat > ] ;[ <expression> ];[ <atribstat>] ) <statement>

for (;;) ; for (a = 0; ; ) read b[a]; for (a = 0; a < b; a = a + 1) read c[a]; print c[a];

28

Outros comandos
Break:

pode ser usado no corpo do for para interromper sua execuo. nulo

Comando

If (a>b) ; else read b;

29

Outros comandos

<statlist> <statement> [<statlist> ] Statlist: um comando composto, inicia-se com um { seguido de uma lista de comandos, e termina com um }. int mymethod(int a) int mymethod(int a)

{ }

{ ; }

int mymethod(int a)

30

lvalue <lvalue>
<lvalue>

ident ( [ <expression> ]| . ident [(<arglist>)] )

Representa uma referncia a uma posio de memria e foi usado em atribstat e readstat. Inicia-se sempre com um identicador que o nome de uma varivel ou um mtodo.

31

lvalue <lvalue>

<lvalue> ident ( [ <expression> ]| . ident [(<arglist>)] ) Esse identicador pode vir seguido vrias vezes por um ndice no caso de se estar referindo a uma varivel indexada; read a[0][1] uma referncia a um campo de um objeto; read a.b um nome de um mtodo seguido por uma lista de argumentos, no caso em que se est fazendo uma chamada de um mtodo.

32

lvalue: exemplos

read a contm somente a referncia a uma varivel simples; read a[0][1] uma referncia a uma varivel indexada; read a.b uma referncia ao campo b da varivel a; read a.b[0][1] uma combinao dos dois tipos anteriores; read a.b(12).c uma combinao dos trs tipos. Nesse caso, a uma varivel que referencia um objeto. Com esse objeto estamos invocando o mtodo b, passando 12 como argumento. Esse mtodo deve retornar um outro objeto do qual estamos referenciando o campo c.

33

Criando objetos <alocexpression>

<alocexpression> new ( ident (<arglist>)| ( int|string|ident) ( [<expression> ])+ ) No comando de atribuio podemos ter uma alocexpression que uma referncia a um novo objeto ou um array.

O que corresponde a: new MyType(10, a * b) new string[10][i][k]

34

Expesses <expression>

<expression> <numexpr> [( <|>|<=|>=|==|! =) <numexpr >] Este no-terminal utilizado para representar as possveis expresses que podem ser construdas na linguagem X++;

35

Subexpresses <numexpr >

<numexpr > <term> ( ( +|) <term> ) quando queremos gerar expresses do tipo a+b+c*d

Numexpr:

36

Subexpresses <term>

<term> <unaryexpr > ( ( |/|%) <unaryexpr > ) Term: segue o mesmo raciocnio para expresses com operadores *, / e % (resto da diviso).

37

Subexpresses <unaryexpr >


<unaryexpr

> [ ( +|) ] <factor >

Uma expresso unria que contenha um operador unrio como a + - 1.

38

Subexpresses <factor >


<factor

> ( int-constant|string-constant| null| <lvalue> |(<expression> ))

Factor:

subexpresses mais simples, como constantes e referncia a variveis.

39

Subexpresses <arglist>
Arglist:

deriva cadeias que representam listas de argumentos, usadas em chamadas de mtodos.

<arglist>

[ <expression> ( ,<expression> ) ]

40

Dvidas?

com Paulo Barbosa

41

Agradecimentos