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