Z perspektywy teorii kompilacji, dlaczego kompilator javac nie akceptowałby oświadczenia o formularzu x = x+++++y
, ale akceptuje x = x+++ ++y
?Dlaczego javac nie akceptuje `x = x +++++ y`?
Odpowiedz
Ponieważ ++
to ważny znak dla lexer java, oświadczenie x+++ ++y
będzie analizowany na tokeny jak:
(x)(++)(+)()(++)(y)
Zważywszy x+++++y
będą tokenized w nieprawidłowy:
(x)(++)(++)(+)(y)
Powyższy jest niepoprawny java, ponieważ operator ++
może być stosowany tylko do rzeczy, które są zmiennymi numerycznymi, co nie jest wynikiem wyniku (x++)
. Ten rodzaj tokenizacji jest doskonałym przykładem koncepcji znanej jako maximal munch.
Najdłuższy możliwy tłumaczenie jest stosowany na każdym kroku, nawet jeśli wynik nie jest ostatecznie złożyć odpowiedni program, podczas gdy inny tłumaczenie leksykalny będzie.
Zatem znaki wejściowe a - b są tokenizowane (§ 3.5) jako a, -, b, które nie jest częścią żadnego gramatycznie poprawnego programu, nawet jeśli tokenizacja a, -, -, b może być część gramatycznie poprawnego programu.
Dobra odpowiedź. Dziękuję Ci. – DSF