View
142
Download
2
Category
Preview:
DESCRIPTION
Apresentação sobre a Linguagem X++ do livro da Novatec
Citation preview
A Linguagem X++
Como construir um compilador
Fellipe Leonardo Madureira de Assis
2
Introdução
Linguagem-alvo do compiladorLinguagem mais simples, com
visão completa à construção de um compilador
Orientada a objetos
| 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++
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++
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++
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++
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++
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++
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++
10
Corpo da classe <classbody>
| A Linguagem X++
<classbody> → ′′ {′′ [ <classlist> ] ( <vardecl>′′ ;′′ )∗
( <constructdecl> )∗ ( <methoddecl> )∗ ′′ }′′
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++
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.
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 ...
14
Declaração de construtores e métodos
<constructdecl> → ′′ constructor′′ <methodbody> <methoddecl> → ( ′′ int′′ | ′′ string′′ | ′′ ident′′ ) ( ′′ [′′
′′ ]′′ )∗
′′ ident′′ <methodbody>
15
Corpo de método (ou construtor)
int a int a, string b string b[][], int a, MyType c
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;...
}
17
Corpo de método (ou construtor)
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++
19
Comando <statement>
| 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++
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++
22
Comando de impressão <printstat>
<printstat > → ′′print′′ <expression>
print 123 print a print a[10].b * c.d[e]
| 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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
35
Subexpressões <numexpr >
<numexpr > → <term> ( ( ′′+′′|′′−′′) <term> )∗
Numexpr: quando queremos gerar expressões do tipo a+b+c*d
| 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++
37
Subexpressões <unaryexpr >
<unaryexpr > → [ ( ′′+′′|′′−′′) ] <factor >
Uma expressão unária que contenha um operador unário como a + - 1.
| 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++
39
Subexpressões <arglist> Arglist: deriva cadeias que representam listas
de argumentos, usadas em chamadas de métodos.
<arglist> → [ <expression> ( ′′,′′<expression> )∗ ]
| A Linguagem X++
40
Dúvidas?
com Paulo Barbosa
| A Linguagem X++
41
Agradecimentos
| FIM
Recommended