relação de palavras reservadas

Estou fazendo uma aplicação para fins acadêmicos onde o programa irá receber um código fonte qualquer (em Java) e entre tantas ações a serem executadas, estou tendo dificuldades com as seguintes:
- retornar a relação das principais palavras reservadas que constam no código recebido;
Ex.: main, for, if, args, System, etc.

 - ocorrência ou não das chaves ({ }) -- início e término de classes, métodos, if, for, etc.

Ex.: No código abaixo
[color=blue]
while(!eof)
{
int input = in.read();
if (input == -1)
{
eof = true;
nlinhas++;
continue;
}[/color]

O meu programa deve responder algo do tipo:
[color=blue]“erro no fechamento de chaves”
ou se estivesse correto,
“chaves ok”

[/color]

Eu preciso de um mini-compilador… que trate as aberturas e fechamento de chaves e o posicionamento correto delas (primeiro abertura e depois o fechamento das mesmas), quanto ao código, não há necessidade verificar se está correto.

Ai depende cara. Por exemplo, voce só quer saber se o número de chaves abertas é o mesmo número de chaves fechadas?

Ou voce realmente vai querer tratar o funcionamento das mesmas, por exemplo

}} {{

No Exemplo, o número de chaves abertas e fechadas é o mesmo, só que é obvio que está errado, pois estamos fechando chaves onde não tem nenhuma aberta.

No primeiro caso é simples implementar, é só contar. No Segundo voce vai ter um pouco mais de trabalho, pelo que percebi seria um mini-compilador ou algo assim? Já é o segundo tópico que vejo nesse estilo :slight_smile:

Eu preciso de um mini-compilador… que trate as aberturas e fechamento de chaves e o posicionamento correto delas (primeiro abertura e depois o fechamento das mesmas), quanto ao código, não há necessidade verificar se está correto.

Grato

Pensando rápido, se voce não depende do código correto, com escopo e tudo mais, acho que só um contador de chaves resolveria o seu problema.

Se voce achar um chave aberta voce adiciona 1 ao contador, se achar uma chave fechada subtrai 1.

Ao achar uma chave fechada voce verifica se tem chave aberta, se não tiver… ali está um erro.

Essa deve ser a forma mais simples e cachorra de se resolver isso :stuck_out_tongue:

Humm… que tal usar um compilador completo. O java 6 disponibiliza acesso ao compilador. Ele irá verificar tudo por si, e de quebra compilar a classe…

dê uma olhada aqui http://today.java.net/pub/a/today/2008/04/10/source-code-analysis-using-java-6-compiler-apis.html

e como saberei se está desta forma { } e não desta } {?

Se porventura a contagem de chaves ficar negativa, você também deve acusar um erro. No seu caso, embora o total seja 0, em algum momento ela ficou em -1, e isso está obviamente errado.

no caso que eu disse… vamos colocar um exemplo: criamos um contador chavesAbertas. A cada chave aberta “}” iremos adicionar um e a cada chave fechada “{” iremos subtrair um, sendo que na hora de subtrair verificaremos se é maior que 0 (ou seja, se tem chave aberta)

class Teste {
}
private int i = 0;
{
}

Tomando este codigo como exemplo (o que importa é as chaves no nosso exemplo).

a nossa variavel chavesAbertsa irá ser inicializada com 0. chavesAbertas = 0;

linha 1: chavesAbertas++; (chavesAbertas = 1)
linha 2: chavesAbertas–; (chavesAbertas = 0)
linha 4: chavesAbertas++; (chavesAbertas = 1)
linha 5: chavesAbertas–; (chavesAbertas = 0)

se tirar a chave da linha 4 ficaria assim

class Teste {
}
private int i = 0;
}

linha 1: chavesAbertas++; (chavesAbertas = 1)
linha 2: chavesAbertas–; (chavesAbertas = 0)
linha 4: chavesAbertas–; (chavesAbertas = -1)

Claro que na hora de diminuir vc deve verificar se o valor é igual a 0, se for… já mandar o erro.

Seria melhor fazer criando métodos, mas quis só passar a idéia, e deixar para voce implementar.

Abraço

No Java, a contagem de chaves abertas e fechadas que foi sugerida acima só deve ser zero se não houver mais nada depois da última chave (exceto, é óbvio, espaços em branco e comentários).

vlw pela ajuda.

Obrigado!