2013-04-17 9 views
6

przypadkowo uderzył spacji i napisał:Wstawiono przypadkową przestrzeń - Dlaczego ta kompilacja?

lTTEvent .CustUpdateStatus := usUnchanged; 

i był zaskoczony, że kompilator akceptowane przestrzeń przed kropką (właściwie dowolna liczba miejsc).

Czy punkt taki jest znakiem specjalnym, który parser może zinterpretować poprawnie? Jak to działa w Pascal?

+1

Można również wstawiać rowki. I usuń wszystkie spacje wokół ': ='. I dodaj spacje przed i po ';' –

+1

Yf linefeeds są również częścią białej linii. –

+2

Możesz również dodawać komentarze, tabulatory i inne spacje w dowolnej z tych lokalizacji. Białe znaki są problematyczne tylko w przypadku słów kluczowych, identyfikatorów i literałów. –

Odpowiedz

13

Parser najpierw tłumaczy tekst na tokeny. Więc tekst:

lTTEvent .CustUpdateStatus := usUnchanged; 

są tłumaczone na żetony:

  • Identyfikator
  • okres
  • Identyfikator
  • staje
  • Identyfikator
  • średnik

Miejsce to odstępy i może mieć trzy funkcje:

  • rozdzielającą żetonów (na przykład od identyfikatora i hasła).
  • dosłownym przestrzeń (w tym przypadku to jest wliczone w ciąg.
  • kosmetyczny.

pierwszy i ostatni przestrzeni funkcyjnych zostaną utracone w tłumaczeniu na żetony.

identyfikator oraz okres ten nie ma żadnych znaków wspólnych, więc nie ma mowy te mogą być mylone więc przestrzeń nie jest wymagane, ale nadal może być używany.

krótką odpowiedź

"TESTUJĄCY" i "." Są tokenami. Tokeny mogą (czasem) być oddzielone białymi znakami.

+0

Nie pamiętam, czy tak jest w Delphi (tak mi się wydaje), ale z tego samego powodu '> =' nie można zapisać jako '> =' (pierwszy z nich to jeden token, drugi to dwa). –

+0

@LeonardoHerrera, Właśnie. Ponieważ> = może być zarówno "> =" i ">", "=", biała spacja jest wymagana. Poza tym kompilator wybiera największy zgodny token. –