Analisador Sintatico/Semantico em java

3 respostas
A

Alow pessoal.

Alguem tem um exemplo em java para fazer compilador que reconheca expressoes logicas da linguagem java, onde operandos podem ser variaveis ou constante e operadores podem ser aritmeticos, logicos ou relacionais…

valew.

3 Respostas

C

Da uma olhada nesse material http://createyourproglang.com/. É pago mas vale muito apena. É implementado uma linguagem parecida com Ruby que roda diretamente na JVM.

D

A seguir, estou postando um exemplo.

O parser gerado a partir dessa gramática do ANTLR reconhece expressões matemáticas.

Foram implementados 5 operadores, onde os '+' e '-' tem menor precedência e os '*', '/', e '^' (exponenciação) tem maior precedência. O parser reconhece também expressões com parênteses.

No final do post estou postando o link para você baixar a gramática, o parser gerado e um exemplo de uso, dentro de um projeto do NetBeans com o ANTLR já inserido.

A medida que o parser interpreta a expressão, ele já vai executando as operações apropriadas. Não é apenas um parser que diz se determinada expressão faz ou não parte da linguagem, mas também um pequeno interpretador.

Essa é a gramática:
/*
 * Gramática para cálculo de expressões matemáticas.
 *
 * @author David Buzatto
 */
grammar Expressoes;

/* 
 * Estrutura:
 * E : M ( '+' M | '-' M )*;
 */
expressao returns [ double v ]

        :    e=multExpr { $v = $e.v; } ( 
                 '+' e=multExpr { $v += $e.v; } 
               | '-' e=multExpr { $v -= $e.v; }  
             )*
        ;
        catch [RecognitionException exc] { throw exc; }

/* 
 * Estrutura:
 * M : A ( '*' A | '/' A | '^' A )*;
 */                     
multExpr returns [ double v ]

        :    e=atom { $v = $e.v; } ( 
                 '*' e=atom { $v *= $e.v; } 
               | '/' e=atom { $v /= $e.v; } 
               | '^' e=atom { $v = Math.pow( $v, $e.v ); }
             )*
        ;
        catch [RecognitionException exc] { throw exc; }

atom returns [ double v ]

        :    NUMERO {
                $v = Double.parseDouble( $NUMERO.text );
             }
        |    '(' expressao ')' {
                 $v = $expressao.v;
             }
        ;
        catch [RecognitionException exc] { throw exc; }



NUMERO    :    ('0'..'9')+ '.' ('0'..'9')*
          |    '.' ('0'..'9')+ 
          |    ('0'..'9')+ 
          ;
          
WS        :    ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;};
Esse é o código para usar o parser gerado:
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;

/**
 *
 * @author David Buzatto
 */
public class TesteExpressoes {

    /**
     * @param args the command line arguments
     */
    public static void main( String[] args ) {
        
        String expressao = "5*(3+4)";
        ANTLRStringStream input = new ANTLRStringStream( expressao );
        ExpressoesLexer lexer = new ExpressoesLexer( input );
        CommonTokenStream tokens = new CommonTokenStream( lexer );
        ExpressoesParser parser = new ExpressoesParser( tokens );
        
        try {
            double resultado = parser.expressao();
            System.out.printf( "%s = %.2f\n", expressao, resultado );
        } catch ( RecognitionException exc ) {
            exc.printStackTrace();
        }
        
    }
}

Download: http://www.4shared.com/file/Oc21SoID/Parser_Expressoes.html

[]'s

A

Valeu mesmo pela dica pessoal. Vou implementar no meu projecto e qualquer duvida posto aqui…

Criado 6 de novembro de 2011
Ultima resposta 7 de nov. de 2011
Respostas 3
Participantes 3