A Linguagem X++

41
A Linguagem X++ Como construir um compilador Fellipe Leonardo Madureira de Assis

description

Apresentação sobre a Linguagem X++ do livro da Novatec

Transcript of A Linguagem X++

Page 1: A Linguagem X++

A Linguagem X++

Como construir um compilador

Fellipe Leonardo Madureira de Assis

Page 2: A Linguagem X++

2

Introdução

Linguagem-alvo do compiladorLinguagem mais simples, com

visão completa à construção de um compilador

Orientada a objetos

| A Linguagem X++

Page 3: A Linguagem X++

3

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 gramática livre de contexto (GLC), mas permite que o lado direito das produções possua alguns operadores.

Operadores:

o Seleção (A|B)o Opção [A]o Repetição 0 ou mais vezes (A)*o Repetição 1 ou mais vezes (A)+

| A Linguagem X++

Page 4: A Linguagem X++

4

Exemplos SeleçãoS → a( b | c | d) e

OpçãoS → a[b]

Repetição 0 ou mais vezes (A)*S → a(b)*c

Repetição 1 ou mais vezes (A)+

S → a(b)+c

| A Linguagem X++

Page 5: A Linguagem X++

5

BNF para a linguagem X++ <symbol> representa o não-terminal symbol;

símbolos terminais são representados com ”symbol” ;

metassímbolos da notação BNF são representados grafados com [ ].

Informações

Símbolos terminais: não podem ser modificados usando as regras da gramática

Símbolos não-terminais: podem ser modificados usando as regras da gramática.

Exemplo: 1. x pode se tornar xa2. x pode se tornar ax

| A Linguagem X++

Page 6: A Linguagem X++

6

Símbolo Inicial <program> <program> → [ <classlist> ]

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

| A Linguagem X++

Page 7: A Linguagem X++

7

Lista de Classes <classlist> <classlist> → ( <classdecl> )+

<classlist> → <classdecl> [<classlist>]

O não-terminal classlist representa uma repetição de declarações de classes, como num programa em Java, que basicamente é composto de uma sequência de declarações de classes como:

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

| A Linguagem X++

Page 8: A Linguagem X++

8

Declaração de classe < classdecl> <classdecl> → ′′ class′′ ′′ ident′′ [ ′′extends′′ ′′ ident′′ ]

<classbody>

Esse não-terminal classdecl representa a declaração de uma classe. Ele indica que tal estrutura se inicia com a palavra reservada class que vem seguida por um identificador (outro terminal) que irá dar nome à classe sendo declarada.

Depois do nome da classe, pode ou não aparecer a palavra extends e o nome da superclasse da qual a classe sendo declarada descende.

class a ...ouclass a extends b ...

| A Linguagem X++

Page 9: A Linguagem X++

9

Corpo da classe <classbody> <classbody> → ′′ {′′ [ <classlist> ] ( <vardecl>′′ ;′

′ )∗

( <constructdecl> )∗ ( <methoddecl> )∗ ′′ }′′

Ele se inicia com um { que (opcionalmente) vem seguido

por um não-terminal classlist, declarado anteriormente. Isso significa que a linguagem permite a declaração declasses aninhadas. Depois, seguem-se as declarações de variáveis,construtores e métodos.

| A Linguagem X++

Page 10: A Linguagem X++

10

Corpo da classe <classbody>

| A Linguagem X++

<classbody> → ′′ {′′ [ <classlist> ] ( <vardecl>′′ ;′′ )∗

( <constructdecl> )∗ ( <methoddecl> )∗ ′′ }′′

Page 11: A Linguagem X++

11

Declaração de variáveis <vardecl>

<vardecl> → ( ′′ int′′ | ′′ string′′ | ′′ ident′′ ) ′′ ident′′ ( ′′ [′′ ′′ ]′′ )∗

( ′′ ,′′ ′′ ident′′ ( ′′ [′′ ′′ ]′′ )∗ )∗

Uma declaração de variáveis, representada pelo não-terminal vardecl, é semelhante à declaração de variáveis em Java.

int a; oustring a,b; oumeutipo a[], b[] [];

| A Linguagem X++

Page 12: A Linguagem X++

12

Declaração de variáveis <vardecl>

Essa produção gera cadeias que começam com o tipo da variável a ser declarada, que pode ser int, string, ou um identificador que é o nome de uma classe declarada no próprio programa.

Em seguida, vêm os nomes das variáveis sendo declaradas.

Podem ser seguidos ou não por colchetes que indicam a dimensão de cada variável.

Page 13: A Linguagem X++

13

Declaração de construtores e métodos

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

′′ ]′′ )∗

′′ ident′′ <methodbody>

A declaração de um construtor começa com a palavra constructor. Um construtor não tem tipo de retorno ou um nome.

A declaração de um método inicia-se com o tipo de retorno do método, que pode ou não ter várias dimensões, seguido pelo nome do método e pelo seu corpo.

int[] fatorial ...

Page 14: A Linguagem X++

14

Declaração de construtores e métodos

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

′′ ]′′ )∗

′′ ident′′ <methodbody>

Page 15: A Linguagem X++

15

Corpo de método (ou construtor)

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

Page 16: A Linguagem X++

16

Corpo de método (construtor)

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

}

construtor (int x, string z) {comando 1;comando 2;...

}

Page 17: A Linguagem X++

17

Corpo de método (ou construtor)

Page 18: A Linguagem X++

18

Comando <statement>

A segunda parte do corpo do método é o statement e é composta de um único comando.

{“comando 1”“comando 2”

...“comando n”

}

| A Linguagem X++

Page 19: A Linguagem X++

19

Comando <statement>

| A Linguagem X++

Page 20: A Linguagem X++

20

Comandos da linguagem declaração de variáveis locais; int a, b, c; comando de atribuição; a = b +c; comando de impressão; print comando de leitura; read comando de término do método e retorno de

valor; return comando de seleção; if comando de repetição; for comando de interrupção de laço; break comando composto; { ... } comando vazio. ;

| A Linguagem X++

Page 21: A Linguagem X++

21

Comando de atribuição <atribstat>

<atribstat> → <lvalue> ′′=′′( <expression> |

<alocexpression> ) Referência a uma posição de memória

(representada pelo não-terminal lvalue), seguida por um = e, depois, uma expressão ou uma referência a um novo objeto, utilizando o operador new.

a = 0a[10] = b + c.da[10].b = new MyType()

| A Linguagem X++

Page 22: A Linguagem X++

22

Comando de impressão <printstat>

<printstat > → ′′print′′ <expression>

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

| A Linguagem X++

Page 23: A Linguagem X++

23

Comando de leitura <readstat>

<readstat> → ′′read′′<lvalue> O lvalue representa uma refeência a

uma poisção de memória, para que o camando de leitura faça sentido

read a read a.b read a.b[c+2]

| A Linguagem X++

Page 24: A Linguagem X++

24

Retorno de método <returnstat>

<returnstat > → ′′return′′ [ <expression> ]

Produz cadeias correspondentes aos comandos de retorno de uma chamada de método

return return 0 return a + b.c

| A Linguagem X++

Page 25: A Linguagem X++

25

Chamada de super-construtor <superstat> <superstat > → ′′super′′ ′′(′′<arglist> ′

′)′′

Nos construtores pode ser utilizado também o comando super para chamada do construtor da superclasse.

super()super(a, null)

| A Linguagem X++

Page 26: A Linguagem X++

26

Comando de seleção <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;

| A Linguagem X++

Page 27: A Linguagem X++

27

Comando de repetição <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];

}

| A Linguagem X++

Page 28: A Linguagem X++

28

Outros comandos

Break: pode ser usado no corpo do for para interromper sua execução.

Comando nulo If (a>b)

;elseread b;

| A Linguagem X++

Page 29: A Linguagem X++

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);

| A Linguagem X++

Page 30: A Linguagem X++

30

lvalue <lvalue> <lvalue> → ′′ident′′ ( ′′[′′ <expression>

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

′] )∗

Representa uma referência a uma posição de memória e foi usado em atribstat e readstat.

Inicia-se sempre com um identificador que é o nome de uma variável ou um método.

| A Linguagem X++

Page 31: A Linguagem X++

31

lvalue <lvalue> <lvalue> → ′′ident′′ ( ′′[′′ <expression> ′′]′′|

′′.′′ ′′ident′′ [′′(′′<arglist>′′)′′] )∗

Esse identificador pode vir seguido várias vezes por

um índice no caso de se estar referindo a uma variável indexada; read a[0][1]

uma referência a um campo de um objeto; read a.b um nome de um método seguido por uma lista de

argumentos, no caso em que se está fazendo uma chamada de um método.

| A Linguagem X++

Page 32: A Linguagem X++

32

lvalue: exemplos read a contém somente a referência a uma variável

simples; read a[0][1] é uma referência a uma variável

indexada; read a.b é uma referência ao campo b da variável a; read a.b[0][1] é uma combinação dos dois tipos anteriores; read a.b(12).c é uma combinação dos três tipos.

Nesse caso, a é uma variável que referencia um objeto. Com esse objeto estamos invocando o método b, passando 12 como argumento. Esse método deve retornar um outro objeto do qual estamos referenciando o campo c.

| A Linguagem X++

Page 33: A Linguagem X++

33

Criando objetos <alocexpression>

<alocexpression> → ′′new′′ ( ′′ident′′ ′′(′′<arglist>′′)′′|( ′′int′′|′′string′′|′′ident′′)( ′′[′′<expression> ′′]′′)+ )

No comando de atribuição podemos ter uma alocexpression que é uma referência a um novo objeto ou um array.

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

| A Linguagem X++

Page 34: A Linguagem X++

34

Expessões <expression>

Este não-terminal é utilizado

para representar as possíveis expressões que podem ser construídas na linguagem X++;

<expression> → <numexpr>[( ′′<′′|′′>′′|′′<=′′|′′>=′′|′′==′′|′′! =′′)

<numexpr >]

| A Linguagem X++

Page 35: A Linguagem X++

35

Subexpressões <numexpr >

<numexpr > → <term> ( ( ′′+′′|′′−′′) <term> )∗

Numexpr: quando queremos gerar expressões do tipo a+b+c*d

| A Linguagem X++

Page 36: A Linguagem X++

36

Subexpressões <term>

<term>→ <unaryexpr > ( ( ′′∗′′|′′/′′|′′%′′) <unaryexpr > )∗

Term: segue o mesmo raciocínio para expressões com operadores *, / e % (resto da divisão).

| A Linguagem X++

Page 37: A Linguagem X++

37

Subexpressões <unaryexpr >

<unaryexpr > → [ ( ′′+′′|′′−′′) ] <factor >

Uma expressão unária que contenha um operador unário como a + - 1.

| A Linguagem X++

Page 38: A Linguagem X++

38

Subexpressões <factor > <factor > → ( ′′int-constant′′|′′string-

constant′′|′′null′′| <lvalue> |′′(′

′<expression> ′′)′′)

Factor: subexpressões mais simples, como constantes e referência a variáveis.

| A Linguagem X++

Page 39: A Linguagem X++

39

Subexpressões <arglist> Arglist: deriva cadeias que representam listas

de argumentos, usadas em chamadas de métodos.

<arglist> → [ <expression> ( ′′,′′<expression> )∗ ]

| A Linguagem X++

Page 40: A Linguagem X++

40

Dúvidas?

com Paulo Barbosa

| A Linguagem X++

Page 41: A Linguagem X++

41

Agradecimentos

| FIM