Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a...

60
Como construir um compilador utilizando ferramentas Java Aula 3 – A linguagem X ++ Prof. M ´ arcio Delamaro [email protected] Como construir um compilador utilizando ferramentas Java – p. 1/3

Transcript of Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a...

Page 1: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Como construir um compilador utilizandoferramentas Java

Aula 3 – A linguagemX++

Prof. Marcio [email protected]

Como construir um compilador utilizando ferramentas Java – p. 1/32

Page 2: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Convenção

〈symbol〉 representa o não-terminal symbol;

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

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

〈methodbody〉 → ′′(′′ 〈paramlist〉 ′′)′′ 〈statement〉

〈returnstat〉 → ′′return′′ [ 〈expression〉 ]

Como construir um compilador utilizando ferramentas Java – p. 2/32

Page 3: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Símbolo inicial

〈program〉 → [ 〈classlist〉 ]

Como construir um compilador utilizando ferramentas Java – p. 3/32

Page 4: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Símbolo inicial

〈program〉 → [ 〈classlist〉 ]

Esse não-terminal indica que um programa em X++écomposto de uma lista de classes ou se trata de umacadeia vazia. Assim, o nosso compilador, ao tentarcompilar um programa armazenado num arquivo queesteja vazio, vai aceitá-lo como um programa válido,como ocorre com a maioria dos compiladores.

Como construir um compilador utilizando ferramentas Java – p. 3/32

Page 5: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Lista de classes

O não-terminal classlist representa uma repetição dedeclarações de classes, como num programa em Java, quebasicamente é composto de uma seqüência de declaraçõesde classes como:

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

Como construir um compilador utilizando ferramentas Java – p. 4/32

Page 6: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

〈classlist〉

〈classlist〉 → ( 〈classdecl〉 )+

Como construir um compilador utilizando ferramentas Java – p. 5/32

Page 7: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

〈classlist〉

〈classlist〉 → ( 〈classdecl〉 )+

〈classlist〉 → 〈classdecl〉 [ 〈classlist〉 ]

Como construir um compilador utilizando ferramentas Java – p. 5/32

Page 8: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Declaração de classe〈classdecl〉

〈classdecl〉 → ′′class′′ ′′ident′′ [ ′′extends′′ ′′ident′′ ]

〈classbody〉

Como construir um compilador utilizando ferramentas Java – p. 6/32

Page 9: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Declaração de classe〈classdecl〉

〈classdecl〉 → ′′class′′ ′′ident′′ [ ′′extends′′ ′′ident′′ ]

〈classbody〉

Esse não-terminal classdecl representa a declaração deuma classe. Ele indica que tal estrutura se inicia com apalavra reservada class que vem seguida por umidentificador (outro terminal) que irá dar nome à classesendo declarada.

Como construir um compilador utilizando ferramentas Java – p. 6/32

Page 10: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Declaração de classe〈classdecl〉

〈classdecl〉 → ′′class′′ ′′ident′′ [ ′′extends′′ ′′ident′′ ]

〈classbody〉

Esse não-terminal classdecl representa a declaração deuma classe. Ele indica que tal estrutura se inicia com apalavra reservada class que vem seguida por umidentificador (outro terminal) que irá dar nome à classesendo declarada.

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

Como construir um compilador utilizando ferramentas Java – p. 6/32

Page 11: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Declaração de classe

class a ...

ou

class a extends b ...

Como construir um compilador utilizando ferramentas Java – p. 7/32

Page 12: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Corpo da classe〈classbody〉

〈classbody〉 → ′′{′′ [ 〈classlist〉 ] ( 〈vardecl〉 ′′;′′ )∗

( 〈constructdecl〉 )∗ ( 〈methoddecl〉 )∗ ′′}′′

Como construir um compilador utilizando ferramentas Java – p. 8/32

Page 13: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Corpo da classe〈classbody〉

〈classbody〉 → ′′{′′ [ 〈classlist〉 ] ( 〈vardecl〉 ′′;′′ )∗

( 〈constructdecl〉 )∗ ( 〈methoddecl〉 )∗ ′′}′′

Ele se inicia com um { que (opcionalmente) vem seguidopor um não-terminal classlist, declarado anteriormente.

Como construir um compilador utilizando ferramentas Java – p. 8/32

Page 14: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Corpo da classe〈classbody〉

〈classbody〉 → ′′{′′ [ 〈classlist〉 ] ( 〈vardecl〉 ′′;′′ )∗

( 〈constructdecl〉 )∗ ( 〈methoddecl〉 )∗ ′′}′′

Ele se inicia com um { que (opcionalmente) vem seguidopor um não-terminal classlist, declarado anteriormente.

Isso significa que a linguagem permite a declaração declasses aninhadas.

Como construir um compilador utilizando ferramentas Java – p. 8/32

Page 15: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Corpo da classe〈classbody〉

〈classbody〉 → ′′{′′ [ 〈classlist〉 ] ( 〈vardecl〉 ′′;′′ )∗

( 〈constructdecl〉 )∗ ( 〈methoddecl〉 )∗ ′′}′′

Ele se inicia com um { que (opcionalmente) vem seguidopor 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.

Como construir um compilador utilizando ferramentas Java – p. 8/32

Page 16: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Declaração de variáveis〈vardecl〉

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

int a;

string a,b;

mytype a[], b[][];

〈vardecl〉 → ( ′′int′′ | ′′string′′ | ′′ident′′ ) ′′ident′′ ( ′′[′′ ′′]′′ )∗

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

Como construir um compilador utilizando ferramentas Java – p. 9/32

Page 17: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Declaração de variáveis

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

Como construir um compilador utilizando ferramentas Java – p. 10/32

Page 18: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Declaração de variáveis

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

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

Como construir um compilador utilizando ferramentas Java – p. 10/32

Page 19: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Declaração de variáveis

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

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

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

Como construir um compilador utilizando ferramentas Java – p. 10/32

Page 20: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Declaração de construtores e métodos〈constructdecl〉 → ′′constructor′′ 〈methodbody〉

〈methoddecl〉 → ( ′′int′′ | ′′string′′ | ′′ident′′ ) ( ′′[′′ ′′]′′ )∗

′′ident′′ 〈methodbody〉

Como construir um compilador utilizando ferramentas Java – p. 11/32

Page 21: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

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 palavraconstructor. Um construtor não tem tipo de retorno ouum nome.

Como construir um compilador utilizando ferramentas Java – p. 11/32

Page 22: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

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 palavraconstructor. Um construtor não tem tipo de retorno ouum nome.

A declaração de um método inicia-se com o tipo deretorno do método, que pode ou não ter váriasdimensões, seguido pelo nome do método e pelo seucorpo.

Como construir um compilador utilizando ferramentas Java – p. 11/32

Page 23: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

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 palavraconstructor. Um construtor não tem tipo de retorno ouum nome.

A declaração de um método inicia-se com o tipo deretorno do método, que pode ou não ter váriasdimensões, seguido pelo nome do método e pelo seucorpo.

int[] fatorial ...

Como construir um compilador utilizando ferramentas Java – p. 11/32

Page 24: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Corpo de método (construtor)

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

}

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

}

Como construir um compilador utilizando ferramentas Java – p. 12/32

Page 25: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Corpo de método (ou construtor)

〈methodbody〉 → ′′(′′ 〈paramlist〉 ′′)′′ 〈statement〉

〈paramlist〉 → [ ( ′′int′′ | ′′string′′ | ′′ident′′ )′′ident′′ ( ′′[′′ ′′]′′ )∗

( ′′,′′ ( ′′int′′ | ′′string′′ | ′′ident′′ )′′ident′′ ( ′′[′′ ′′]′′ )∗ )∗ ]

int a

int a, string b

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

Como construir um compilador utilizando ferramentas Java – p. 13/32

Page 26: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Comandos da linguagemdeclaraçã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. ;

Como construir um compilador utilizando ferramentas Java – p. 14/32

Page 27: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Comando〈statement〉

〈statement〉 → (

〈vardecl〉 ′′;′′ |

〈atribstat〉 ′′;′′ |

〈printstat〉 ′′;′′ |

〈readstat〉 ′′;′′ |

〈returnstat〉 ′′;′′ |

〈superstat〉 ′′;′′ |

〈ifstat〉 |

〈forstat〉 |′′{′′ 〈statlist〉 ′′}′′ |′′break′′ ′′;′′ |′′;′′

)Como construir um compilador utilizando ferramentas Java – p. 15/32

Page 28: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Comando de atribuição〈atribstat〉

〈atribstat〉 → 〈lvalue〉 ′′ =′′

( 〈expression〉 | 〈alocexpression〉 )

Como construir um compilador utilizando ferramentas Java – p. 16/32

Page 29: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Comando de atribuição〈atribstat〉

〈atribstat〉 → 〈lvalue〉 ′′ =′′

( 〈expression〉 | 〈alocexpression〉 )

Referência a uma posição de memória (representadapelo não-terminal lvalue), seguida por um = e, depois,uma expressão ou uma referência a um novo objeto,utilizando o operador new.

Como construir um compilador utilizando ferramentas Java – p. 16/32

Page 30: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Comando de atribuição〈atribstat〉

〈atribstat〉 → 〈lvalue〉 ′′ =′′

( 〈expression〉 | 〈alocexpression〉 )

Referência a uma posição de memória (representadapelo 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()

Como construir um compilador utilizando ferramentas Java – p. 16/32

Page 31: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Comando de impressão〈printstat〉

〈printstat〉 → ′′print′′ 〈expression〉

Como construir um compilador utilizando ferramentas Java – p. 17/32

Page 32: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Comando de impressão〈printstat〉

〈printstat〉 → ′′print′′ 〈expression〉

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

Como construir um compilador utilizando ferramentas Java – p. 17/32

Page 33: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Comando de leitura〈readstat〉

〈readstat〉 → ′′read′′ 〈lvalue〉

Como construir um compilador utilizando ferramentas Java – p. 18/32

Page 34: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Comando de leitura〈readstat〉

〈readstat〉 → ′′read′′ 〈lvalue〉

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

Como construir um compilador utilizando ferramentas Java – p. 18/32

Page 35: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Retorno de método〈returnstat〉

〈returnstat〉 → ′′return′′ [ 〈expression〉 ]

Como construir um compilador utilizando ferramentas Java – p. 19/32

Page 36: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Retorno de método〈returnstat〉

〈returnstat〉 → ′′return′′ [ 〈expression〉 ]

returnreturn 0return a + b.c

Como construir um compilador utilizando ferramentas Java – p. 19/32

Page 37: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Chamada de super-construtor〈superstat〉

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

Como construir um compilador utilizando ferramentas Java – p. 20/32

Page 38: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Chamada de super-construtor〈superstat〉

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

〈superstat〉 → ′′super′′ ′′(′′ 〈arglist〉 ′′)′′

Como construir um compilador utilizando ferramentas Java – p. 20/32

Page 39: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Chamada de super-construtor〈superstat〉

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

〈superstat〉 → ′′super′′ ′′(′′ 〈arglist〉 ′′)′′

super()super(a, null)

Como construir um compilador utilizando ferramentas Java – p. 20/32

Page 40: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

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;

Como construir um compilador utilizando ferramentas Java – p. 21/32

Page 41: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

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

}

Como construir um compilador utilizando ferramentas Java – p. 22/32

Page 42: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Outros〈statement〉 → (

〈vardecl〉 ′′;′′ |

〈atribstat〉 ′′;′′ |

〈printstat〉 ′′;′′ |

〈readstat〉 ′′;′′ |

〈returnstat〉 ′′;′′ |

〈superstat〉 ′′;′′ |

〈ifstat〉 |

〈forstat〉 |

”{” 〈statlist〉 ”}” |

”break” ”;” |

”;”)

Como construir um compilador utilizando ferramentas Java – p. 23/32

Page 43: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Outros

if (a > b);

elseread b;

for (a = 0; a < b; a = a + 1){

read c[a];if (a > b)

break;else

print c[a];}

Como construir um compilador utilizando ferramentas Java – p. 24/32

Page 44: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Quais são válidos?

〈statlist〉 → 〈statement〉 [ 〈statlist〉 ]

int mymethod(int a){}

int mymethod(int a){

;}

int mymethod(int a);

Como construir um compilador utilizando ferramentas Java – p. 25/32

Page 45: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

lvalue 〈lvalue〉

〈lvalue〉 → ′′ident′′ ( ′′[′′ 〈expression〉 ′′]′′ |′′.′′ ′′ident′′ [ ′′(′′ 〈arglist〉 ′′)′′ ] )∗

Como construir um compilador utilizando ferramentas Java – p. 26/32

Page 46: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

lvalue 〈lvalue〉

〈lvalue〉 → ′′ident′′ ( ′′[′′ 〈expression〉 ′′]′′ |′′.′′ ′′ident′′ [ ′′(′′ 〈arglist〉 ′′)′′ ] )∗

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

Como construir um compilador utilizando ferramentas Java – p. 26/32

Page 47: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

lvalue 〈lvalue〉

〈lvalue〉 → ′′ident′′ ( ′′[′′ 〈expression〉 ′′]′′ |′′.′′ ′′ident′′ [ ′′(′′ 〈arglist〉 ′′)′′ ] )∗

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

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

Como construir um compilador utilizando ferramentas Java – p. 26/32

Page 48: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

lvalue 〈lvalue〉

〈lvalue〉 → ′′ident′′ ( ′′[′′ 〈expression〉 ′′]′′ |′′.′′ ′′ident′′ [ ′′(′′ 〈arglist〉 ′′)′′ ] )∗

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

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

Esse identificador pode vir seguido várias vezes por umíndice no caso de se estar referindo a uma variávelindexada; ou

Como construir um compilador utilizando ferramentas Java – p. 26/32

Page 49: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

lvalue 〈lvalue〉

〈lvalue〉 → ′′ident′′ ( ′′[′′ 〈expression〉 ′′]′′ |′′.′′ ′′ident′′ [ ′′(′′ 〈arglist〉 ′′)′′ ] )∗

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

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

Esse identificador pode vir seguido várias vezes por umíndice no caso de se estar referindo a uma variávelindexada; ou

uma referência a um campo de um objeto; ou

Como construir um compilador utilizando ferramentas Java – p. 26/32

Page 50: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

lvalue 〈lvalue〉

〈lvalue〉 → ′′ident′′ ( ′′[′′ 〈expression〉 ′′]′′ |′′.′′ ′′ident′′ [ ′′(′′ 〈arglist〉 ′′)′′ ] )∗

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

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

Esse identificador pode vir seguido várias vezes por umíndice no caso de se estar referindo a uma variávelindexada; ou

uma referência a um campo de um objeto; ou

um nome de um método seguido por uma lista deargumentos, no caso em que se está fazendo umachamada de um método.

Como construir um compilador utilizando ferramentas Java – p. 26/32

Page 51: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

lvalue: exemplosread a; contém somente a referência a uma variávelsimples;

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

read a.b é uma referência ao campo b da variável a;

read a.b[0][1] é uma combinação dos dois tiposanteriores;

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 deveretornar um outro objeto do qual estamos referenciandoo campo c.

Como construir um compilador utilizando ferramentas Java – p. 27/32

Page 52: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

lvalue impróprio

Utilizando este não-terminal num comando de atribuiçãopoderíamos ter a.b(12) = 10, o que é ilegal poisestaríamos tentando atribuir valor a uma chamada demétodo. Sintaticamente isso, porém, será permitido nanossa linguagem. Tal erro será apontado em fasesposteriores da análise.

Como construir um compilador utilizando ferramentas Java – p. 28/32

Page 53: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Criação de objetos

〈alocexpression〉 → ′′new′′ ( ′′ident′′ ′′(′′ 〈arglist〉 ′′)′′ |

( ′′int′′ | ′′string′′ | ′′ident′′ )

( ′′[′′ 〈expression〉 ′′]′′ )+ )

new MyType(10, a * b)

new string[10][i][k]

Como construir um compilador utilizando ferramentas Java – p. 29/32

Page 54: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Expressões

〈expression〉 → 〈numexpr〉 [

( ′′ <′′ | ′′ >′′ | ′′ <=′′ | ′′ >=′′ |′′ ==′′ | ′′! =′′ )

〈numexpr〉 ]

Como construir um compilador utilizando ferramentas Java – p. 30/32

Page 55: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Expressões

〈expression〉 → 〈numexpr〉 [

( ′′ <′′ | ′′ >′′ | ′′ <=′′ | ′′ >=′′ |′′ ==′′ | ′′! =′′ )

〈numexpr〉 ]

〈numexpr〉 → 〈term〉 ( ( ′′ +′′ | ′′ −′′ ) 〈term〉 )∗

Como construir um compilador utilizando ferramentas Java – p. 30/32

Page 56: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Expressões

〈expression〉 → 〈numexpr〉 [

( ′′ <′′ | ′′ >′′ | ′′ <=′′ | ′′ >=′′ |′′ ==′′ | ′′! =′′ )

〈numexpr〉 ]

〈numexpr〉 → 〈term〉 ( ( ′′ +′′ | ′′ −′′ ) 〈term〉 )∗

〈term〉 → 〈unaryexpr〉 (

( ′′ ∗′′ | ′′/′′ | ′′%′′ )

〈unaryexpr〉 )∗

Como construir um compilador utilizando ferramentas Java – p. 30/32

Page 57: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Expressões

〈unaryexpr〉 → [ ( ′′ +′′ | ′′ −′′ ) ] 〈factor〉

Como construir um compilador utilizando ferramentas Java – p. 31/32

Page 58: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Expressões

〈unaryexpr〉 → [ ( ′′ +′′ | ′′ −′′ ) ] 〈factor〉

〈factor〉 → ( ′′int-constant′′ | ′′string-constant′′ |′′null′′ | 〈lvalue〉 | ′′(′′ 〈expression〉 ′′)′′ )

Como construir um compilador utilizando ferramentas Java – p. 31/32

Page 59: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Expressões

〈unaryexpr〉 → [ ( ′′ +′′ | ′′ −′′ ) ] 〈factor〉

〈factor〉 → ( ′′int-constant′′ | ′′string-constant′′ |′′null′′ | 〈lvalue〉 | ′′(′′ 〈expression〉 ′′)′′ )

〈arglist〉 → [ 〈expression〉 ( ′′,′′ 〈expression〉 )∗ ]

Como construir um compilador utilizando ferramentas Java – p. 31/32

Page 60: Como construir um compilador utilizando ferramentas Java · 2009-03-19 · como ocorre com a maioria dos compiladores. Como construir um compilador utilizando ferramentas Java –

Exercícios

a. Reescreva a BNF de X++usando grafo sintático.

b. Estudar o programa de árvore de busca binária do finaldo Capítulo 2.

c. Escreva um programa em X++que implementa asoperações de uma pilha e de uma fila.

d. Escreva uma classe “Sort” em X++que implementa obublesort e quicksort.

Como construir um compilador utilizando ferramentas Java – p. 32/32