Você está na página 1de 16

31/08/2013

Prof. Andr Ricardo Jovetta

<symbol> representa o no-terminal symbol; smbolos terminais so representados com symbol ; metassmbolos da notao BNF so representados grafados com [ ]. <methodbody> ( <paramlist> ) <statement > <returnstat> return [ <expression>]

31/08/2013

<program> [ <classlist> ] Esse no-terminal indica que um programa em X++ composto de uma lista de classes ou se trata de uma cadeia vazia. Assim, o nosso compilador, ao tentar compilar um programa armazenado num arquivo que esteja vazio, vai aceit-lo como um programa vlido, como ocorre com a maioria dos compiladores.

O no-terminal classlist representa uma repetio de declaraes de classes, como num programa em Java, que basicamente composto de uma seqncia de declaraes de classes como: class a {....} class b {....} .... class c {....}

31/08/2013

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

<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 identificador (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.

31/08/2013

class a ... Ou class a extends b ...

<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.

31/08/2013

Uma declarao de variveis, representada pelo no-terminal vardecl, semelhante declarao de variveis em Java. int a; string a,b; mytype a[ ], b[ ][ ]; <vardecl > ( int | string | ident ) ident ( [ ] )* ( , ident ( [ ] )* )*

Essa produo gera cadeias que comeam com o tipo da varivel a ser declarada, que pode ser int, string, ou um identificador 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.

31/08/2013

<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 ...

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

31/08/2013

<methodbody> ( <paramlist > ) <statement > <paramlist> [ ( int | string | ident ) ident ( [ ] )* ( , ( int | string | ident ) ident ( [ ] )* )* ] int a int a, string b string b[][], int a, MyType c

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

31/08/2013

<statement> ( <vardecl > ; | <atribstat > ; | <printstat> ; | <readstat> ; | <returnstat> ; | <superstat> ; | <ifstat> | <forstat> | { <statlist> } | break ; | ; )

<atribstat > <lvalue> = ( <expression> | <alocexpression>) Referncia a uma posio de memria (representada pelo noterminal 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()

31/08/2013

<Printstat> print <expression>

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

<readstat> read <lvalue> read a read a.b read a.b[c+2]

31/08/2013

<returnstat > return [ <expression> ]

Return return 0 return a + b.c

Nos construtores pode ser utilizado tambm o comando super para chamada do construtor da superclasse. <superstat > super ( <arglist> )

super() super(a, null)

10

31/08/2013

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

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

11

31/08/2013

<statement> ( <vardecl > ; | <atribstat > ; | <printstat> ; | <readstat> ; | <returnstat> ; | <superstat> ; | <ifstat> | <forstat> | { <statlist statlist>} >} | break break ; | ; )

if (a > b) ; else read b; for (a = 0; a < b; a = a + 1) { read c[a]; if (a > b) break; else print c[a]; }

12

31/08/2013

<statlist> <statement> [ <statlist> ] int mymethod(int a) { } int mymethod(int a) { ; } int mymethod(int a) ;

<lvalue> ident ( [ <expression> ] | . ident [ ( <arglist> ) ] )* Representa uma referncia a uma posio de memria e foi usado em atribstat e readstat. readstat Inicia-se sempre com um identificador que o nome de uma varivel ou um mtodo. Esse identificador pode vir seguido vrias vezes por um ndice no caso de se estar referindo a uma varivel indexada; Ou uma referncia a um campo de um objeto; ou um nome de um mtodo seguido por uma lista de argumentos, no caso em que se est fazendo uma chamada de um mtodo.

13

31/08/2013

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.

Utilizando este no-terminal num comando de atribuio poderamos ter a.b(12) = 10, o que ilegal pois estaramos tentando atribuir valor a uma chamada de mtodo. Sintaticamente isso, porm, ser permitido na nossa linguagem. Tal erro ser apontado em fases posteriores da anlise.

14

31/08/2013

<alocexpression> new ( ident ( <arglist> ) | ( int | string | ident ) ( [ <expression> ] )+ ) new MyType(10, a * b) new string[10][i][k]

<expression> <numexpr > [ ( < | > | <= | >= | == | ! = ) <numexpr > ] <numexpr > <term> ( ( + | ) <term> )* <term> <unaryexpr> ( ( | / | % ) <unaryexpr> )*

15

31/08/2013

<unaryexpr> [ ( + | ) ] <factor> <factor> ( int-constant | string-constant | null | <lvalue> | ( <expression> ) ) <arglist> [ <expression> ( , <expression> )* ]

Reescreva a BNF de X++usando grafo sinttico.

16

Você também pode gostar