Introduo
Linguagem-alvo
do compilador Linguagem mais simples, com viso completa construo de um compilador Orientada a objetos
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
S a(b)*c
Repetio
S a(b)+c
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
[ <classlist> ]
Esse no-terminal indica que um programa em X++ composto de uma lista de classes ou se trata de uma cadeia vazia.
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:
<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.
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
11
Uma declarao de variveis, representada pelo no-terminal vardecl, semelhante declarao de variveis em Java.
12
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
<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
15
16
17
18
Comando <statement>
A
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
<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
23
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
> return [ <expression> ] Produz cadeias correspondentes aos comandos de retorno de uma chamada de mtodo return return 0 return a + b.c
25
construtores pode ser utilizado tambm o comando super para chamada do construtor da superclasse.
super()
super(a, null)
26
<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
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
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>
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
<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.
34
Expesses <expression>
<expression> <numexpr> [( <|>|<=|>=|==|! =) <numexpr >] Este no-terminal utilizado para representar as possveis expresses que podem ser construdas na linguagem X++;
35
<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
38
Factor:
39
Subexpresses <arglist>
Arglist:
<arglist>
[ <expression> ( ,<expression> ) ]
40
Dvidas?
41
Agradecimentos