Faça
Grammar ::= Rule { Rule }
Rule ::= RuleName "::=" Prodution
{ "|" Production }
Production
::= | SimpleProduction { SimpleProduction }
SimpleProduction ::=
| "[" SimpleProduction "]"
| "{" SimpleProduction "}"
E ::= T {
OperAdd T }
T ::= F { OperMult F }
F ::= [minus] SF
SF ::= ident
| number
OperAdd ::= plus | minus
OperMult ::= mult | div
O
void e() {
// E ::= T { OperAdd T }
t();
while ( lexer.token
== Symbol.PLUS ||
lexer.token == Symbol.MINUS ) {
operAdd();
t();
}
}
void t() {
// T ::= F {
OperMult F }
f();
while ( lexer.token
== Symbol.PLUS ||
lexer.token == Symbol.MINUS ) {
operMult();
f();
}
}
void f() {
// F ::= [minus]
SF
if ( lexer.token ==
Symbol.MINUS )
lexer.nextToken();
sf();
}
void sf() {
// SF ::=
ident | number
if ( lexer.token ==
Symbol.IDENT )
lexer.nextToken();
else if (
lexer.token == Symbol.NUMBER )
lexer.nextToken();
else
error("Syntax
error");
}
void operAdd() {
// OperAdd ::=
plus | minus
if ( lexer.token ==
Symbol.PLUS )
lexer.nextToken();
else if (
lexer.token == Symbol.MINUS )
lexer.nextToken();
else
error("Syntax
error");
}
void operMult() {
// OperMult ::=
mult | div
if ( lexer.token ==
Symbol.MULT )
lexer.nextToken();
else if (
lexer.token == Symbol.DIV )
lexer.nextToken();
else
error("Syntax
error");
}
S ::= A | B | C
void s() {
switch (
lexer.nextToken() ) {
case 'a' :
case 'b' :
a();
break;
case 'c' :
b();
break;
case 'c' :
case 'd' :
case 'e' :
c();
break;
error("Syntax
error");
}
}
Neste