Fiz o exemplo da gramática:
/**
* Parser para a gramática:
*
* E => T Ei
* Ei => '+' T Ei | ep
* T => F Ti
* Ti => '*' F Ti | ep
* F => '0'..'9' | '(' E ')'
*
* @author David Buzatto
*/
public class Parser {
private char token;
private int posToken;
private char[] entrada;
public static void main( String[] args ) {
System.out.println( new Parser().parse( "(2+2+2)+2*3".toCharArray() ) );
}
public int parse( char[] entrada ) {
this.entrada = entrada;
posToken = 0;
// vai para o próximo token
proximoToken();
int resultado = E();
// se o token corrente for diferente de '[code]/**
* Parser para a gramática:
*
* E => T Ei
* Ei => '+' T Ei | ep
* T => F Ti
* Ti => '*' F Ti | ep
* F => '0'..'9' | '(' E ')'
*
* @author David Buzatto
*/
public class Parser {
private char token;
private int posToken;
private char[] entrada;
public static void main( String[] args ) {
System.out.println( new Parser().parse( "(2+2+2)+2*3".toCharArray() ) );
}
public int parse( char[] entrada ) {
this.entrada = entrada;
posToken = 0;
// vai para o próximo token
proximoToken();
int resultado = E();
// se o token corrente for diferente de '\0' quer dizer
// que faltaram tokens para reconhecer, então dispara um erro
if ( token != '\0' ) {
erro();
}
return resultado;
}
private int E() {
int esquerda = T();
int direita = Ei();
return esquerda + direita;
}
private int T() {
int esquerda = F();
int direita = Ti();
return esquerda * direita;
}
private int Ei() {
// 0 é o elemento neutro da adição
int resultado = 0;
if ( token == '+' ) {
proximoToken();
int esquerda = T();
int direita = Ei();
resultado = esquerda + direita;
}
return resultado;
}
private int Ti() {
// 1 é o elemento neutro da multiplicação
int resultado = 1;
if ( token == '*' ) {
proximoToken();
int esquerda = F();
int direita = Ti();
resultado = esquerda + direita;
}
return resultado;
}
private int F() {
int resultado = 0;
if ( token == '(' ) {
proximoToken();
resultado = E();
if ( token == ')' ) {
proximoToken();
} else {
erro();
}
return resultado;
} else {
return numero();
}
}
private int numero() {
int resultado = 0;
if ( token >= '0' && token <= '9' ) {
resultado = token - '0';
proximoToken();
} else {
erro();
}
return resultado;
}
private void proximoToken() {
while ( posToken < entrada.length && entrada[posToken] == ' ' ) {
posToken++;
}
if ( posToken < entrada.length ) {
token = entrada[posToken];
posToken++;
} else {
token = '\0';
}
}
private void erro() {
if ( posToken == 0 ) {
posToken = 1;
} else if ( posToken >= entrada.length ) {
posToken = entrada.length;
}
String strEntrada = new String( entrada, posToken - 1, entrada.length - posToken + 1 );
String strErro = "Erro em \"" + strEntrada + "\"";
System.out.print( strErro );
throw new RuntimeException( strErro );
}
}
' quer dizer
// que faltaram tokens para reconhecer, então dispara um erro
if ( token != '
/**
* Parser para a gramática:
*
* E => T Ei
* Ei => '+' T Ei | ep
* T => F Ti
* Ti => '*' F Ti | ep
* F => '0'..'9' | '(' E ')'
*
* @author David Buzatto
*/
public class Parser {
private char token;
private int posToken;
private char[] entrada;
public static void main( String[] args ) {
System.out.println( new Parser().parse( "(2+2+2)+2*3".toCharArray() ) );
}
public int parse( char[] entrada ) {
this.entrada = entrada;
posToken = 0;
// vai para o próximo token
proximoToken();
int resultado = E();
// se o token corrente for diferente de '\0' quer dizer
// que faltaram tokens para reconhecer, então dispara um erro
if ( token != '\0' ) {
erro();
}
return resultado;
}
private int E() {
int esquerda = T();
int direita = Ei();
return esquerda + direita;
}
private int T() {
int esquerda = F();
int direita = Ti();
return esquerda * direita;
}
private int Ei() {
// 0 é o elemento neutro da adição
int resultado = 0;
if ( token == '+' ) {
proximoToken();
int esquerda = T();
int direita = Ei();
resultado = esquerda + direita;
}
return resultado;
}
private int Ti() {
// 1 é o elemento neutro da multiplicação
int resultado = 1;
if ( token == '*' ) {
proximoToken();
int esquerda = F();
int direita = Ti();
resultado = esquerda + direita;
}
return resultado;
}
private int F() {
int resultado = 0;
if ( token == '(' ) {
proximoToken();
resultado = E();
if ( token == ')' ) {
proximoToken();
} else {
erro();
}
return resultado;
} else {
return numero();
}
}
private int numero() {
int resultado = 0;
if ( token >= '0' && token <= '9' ) {
resultado = token - '0';
proximoToken();
} else {
erro();
}
return resultado;
}
private void proximoToken() {
while ( posToken < entrada.length && entrada[posToken] == ' ' ) {
posToken++;
}
if ( posToken < entrada.length ) {
token = entrada[posToken];
posToken++;
} else {
token = '\0';
}
}
private void erro() {
if ( posToken == 0 ) {
posToken = 1;
} else if ( posToken >= entrada.length ) {
posToken = entrada.length;
}
String strEntrada = new String( entrada, posToken - 1, entrada.length - posToken + 1 );
String strErro = "Erro em \"" + strEntrada + "\"";
System.out.print( strErro );
throw new RuntimeException( strErro );
}
}
' ) {
erro();
}
return resultado;
}
private int E() {
int esquerda = T();
int direita = Ei();
return esquerda + direita;
}
private int T() {
int esquerda = F();
int direita = Ti();
return esquerda * direita;
}
private int Ei() {
// 0 é o elemento neutro da adição
int resultado = 0;
if ( token == '+' ) {
proximoToken();
int esquerda = T();
int direita = Ei();
resultado = esquerda + direita;
}
return resultado;
}
private int Ti() {
// 1 é o elemento neutro da multiplicação
int resultado = 1;
if ( token == '*' ) {
proximoToken();
int esquerda = F();
int direita = Ti();
resultado = esquerda + direita;
}
return resultado;
}
private int F() {
int resultado = 0;
if ( token == '(' ) {
proximoToken();
resultado = E();
if ( token == ')' ) {
proximoToken();
} else {
erro();
}
return resultado;
} else {
return numero();
}
}
private int numero() {
int resultado = 0;
if ( token >= '0' && token <= '9' ) {
resultado = token - '0';
proximoToken();
} else {
erro();
}
return resultado;
}
private void proximoToken() {
while ( posToken < entrada.length && entrada[posToken] == ' ' ) {
posToken++;
}
if ( posToken < entrada.length ) {
token = entrada[posToken];
posToken++;
} else {
token = '
/**
* Parser para a gramática:
*
* E => T Ei
* Ei => '+' T Ei | ep
* T => F Ti
* Ti => '*' F Ti | ep
* F => '0'..'9' | '(' E ')'
*
* @author David Buzatto
*/
public class Parser {
private char token;
private int posToken;
private char[] entrada;
public static void main( String[] args ) {
System.out.println( new Parser().parse( "(2+2+2)+2*3".toCharArray() ) );
}
public int parse( char[] entrada ) {
this.entrada = entrada;
posToken = 0;
// vai para o próximo token
proximoToken();
int resultado = E();
// se o token corrente for diferente de '\0' quer dizer
// que faltaram tokens para reconhecer, então dispara um erro
if ( token != '\0' ) {
erro();
}
return resultado;
}
private int E() {
int esquerda = T();
int direita = Ei();
return esquerda + direita;
}
private int T() {
int esquerda = F();
int direita = Ti();
return esquerda * direita;
}
private int Ei() {
// 0 é o elemento neutro da adição
int resultado = 0;
if ( token == '+' ) {
proximoToken();
int esquerda = T();
int direita = Ei();
resultado = esquerda + direita;
}
return resultado;
}
private int Ti() {
// 1 é o elemento neutro da multiplicação
int resultado = 1;
if ( token == '*' ) {
proximoToken();
int esquerda = F();
int direita = Ti();
resultado = esquerda + direita;
}
return resultado;
}
private int F() {
int resultado = 0;
if ( token == '(' ) {
proximoToken();
resultado = E();
if ( token == ')' ) {
proximoToken();
} else {
erro();
}
return resultado;
} else {
return numero();
}
}
private int numero() {
int resultado = 0;
if ( token >= '0' && token <= '9' ) {
resultado = token - '0';
proximoToken();
} else {
erro();
}
return resultado;
}
private void proximoToken() {
while ( posToken < entrada.length && entrada[posToken] == ' ' ) {
posToken++;
}
if ( posToken < entrada.length ) {
token = entrada[posToken];
posToken++;
} else {
token = '\0';
}
}
private void erro() {
if ( posToken == 0 ) {
posToken = 1;
} else if ( posToken >= entrada.length ) {
posToken = entrada.length;
}
String strEntrada = new String( entrada, posToken - 1, entrada.length - posToken + 1 );
String strErro = "Erro em \"" + strEntrada + "\"";
System.out.print( strErro );
throw new RuntimeException( strErro );
}
}
';
}
}
private void erro() {
if ( posToken == 0 ) {
posToken = 1;
} else if ( posToken >= entrada.length ) {
posToken = entrada.length;
}
String strEntrada = new String( entrada, posToken - 1, entrada.length - posToken + 1 );
String strErro = "Erro em \"" + strEntrada + "\"";
System.out.print( strErro );
throw new RuntimeException( strErro );
}
}[/code]
É analisador léxico e sintático muuuuuito simples para expressões com as operações de adição e multiplicação, respeitando a precedência dos operadores e o uso de parênteses.
Se quiser colocar as outras operações é só queimar um pouco de fosfato :D
[]´s