Olá pessoal,
comecei a estudar para a certificação pelo livro SCJP,
nos primeiros códigos que eu estou executando encontrei pontos e vírgulas em lugares desnecessários
no final da linha do método main por exemplo e logo após o loop.
O programa compilou e rodou normalmente.
Aguém sabe explicar o que acontece?
Porque o compilador não reclama?
E pior ainda (eu acho), roda sem problemas?
public class TestDays {
enum Days {MON, TUE, WED};
public static void main (String [] args) {;
for (Days day : Days.values())
;;;;;;;;;;;;;;;;;;;;;;;;;;
Days[] days = Days.values();
System.out.print(days[2]);
}
}
Em outras linguagens isso também ocorre, cara.
Na verdade, isso tem a ver com as definições sintáticas da linguagem. O autômato que interpreta esse bichinho aí entende que ; é um lexema que leva a um estado final válido. O lexema anterior é um espaço ou uma expressão que já foi avaliada como válida e não interfere nela. Logo, estado inicial e final são válidos - e o “caminho” entre eles é sempre o mesmo, ou seja, é determinístico.
Então, não teria por quê criar uma regra sintática só pra validar que o ; está “desacompanhado”. A complexidade na interpretação aumentaria (com relação à expressões regulares e autômatos finitos) e o benefício é zero.
Abraço!
Ah, e talvez eu tenha falado alguma besteira. Cursei compiladores há algum tempo, de repente já me esqueci ou confundi com boa parte desse trem.
Então, se queres mesmo entender esse negócio a fundo, procure sobre análise sintática em compiladores.
Abraço!
Se olhar na definição da linguagem ( http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.6 ) você vai ver que um “;” sozinho é um “empty statement”.
Observe que não é em todo lugar em que você encontra um “;” que você pode repeti-lo à vontade. Por exemplo, dentro de um for , deve haver exatamente 2 “;”, mesmo que haja alguns lugares vazios. As seguintes declarações são todas válidas.
for (int i = 0; i < 10; ++i)
...
for ( ; i > 20; --i)
...
for ( ; ; )
...
for (int i = 0; i < 10; )
Valeu pelas dicas pessoal.
Abraço.