2011-12-27 42 views
5

Spec wymienia rodzaje tokenów pp na 2,5, ale zawiera ostatnią kategorięJakie znaki są pozostawione dla tokenów pp?

każda postać non-white-space, że nie może być jednym z powyższym

mam trudności ze znalezieniem przykład, w którym pp token przechwytujący taki znak daje prawidłowy program C++. Jak wyjaśnia 2.5, program może zawierać dziki token " lub ', ale zachowanie jest niezdefiniowane. Czy istnieje przykład prawidłowego programu?

Odpowiedz

1

Można uszeregować zgubiony znacznik do ważności. Tak właściwie; już to zrobiłeś w a previous question!

Bezpańskie żetony postaci może również pojawić się w grupie pomijane przez kompilacji warunkowej, czyli

#if 0 
@ \ ` € 
#endif 

Należy zauważyć, że we wszystkich tych przypadkach, tylko zabłąkany postaci tokena jest backslash, ponieważ UCN takich jak \u0040 nie utworzyć identyfikator, a UCN jest szczególnym przypadkiem w identyfikatorach, a sam ukośnik odwrotny jest "najdłuższą sekwencją znaków, która może stanowić token przetwarzania wstępnego", z u0040 będącym oddzielnym identyfikatorem.

+0

Hm jednak tylko znak \ tych zabłąkanych tokenów pasuje do ostatniej kategorii znaczników pp, ponieważ jest to jedyny znak w tym wierszu, który znajduje się w podstawowym zestawie znaków źródłowych. Pozostałe staną się UCN (identyfikatory), czy coś mi brakuje? Akceptuję to z powodu pomysłu '#if 0' i pomysłu stringize/concatenate. Dzięki! –

+0

Tylko niektóre UCN mogą tworzyć identyfikatory (§E). Z technicznego punktu widzenia uważam, że trzy rozszerzone znaki tworzą bezpańskie ukośniki odwrotne, a następnie alfanumeryczną sekwencję, która staje się identyfikatorem. Wynika to z jawnej maksymalnej reguły muncha. (Faktycznie, które zakłada, że ​​znaki diakrytyczne * * nie może być catenated, bo tylko wiodącym backslash jest postrzegana przez ## operatora ''!) – Potatoswatter

+0

„może” lub „może”? Jeśli jest to „może”, to zgodnie z dyrektywami IEC, nieważne sekwencja znaków musi być nadal lexed jako identyfikator i odrzucone jako nieprawidłowe później. –

1

Wierzę, że na przykład $ i @ należą do tej kategorii (zakładając, że te znaki znajdują się w zestawie znaków źródłowych). Oba są poprawnymi tokenami pp, ale nie są ważnymi tokenami i zostaną zdiagnozowane jako błąd składniowy w późniejszej fazie tłumaczenia (chyba że zostały usunięte przez #if, #ifdef, itp.).

Nie znam żadnego przypadku, w którym taki znacznik pp skutkuje ważnym tokenem.

+0

Hm, '$' i '@' nie znajdują się w podstawowym zestawie znaków źródłowych. Więc oba zostaną przetłumaczone na uniwersalne nazwy postaci i będą obsługiwane przez inne kategorie znaczników pp (identyfikator). –

+0

Może "#", który nie jest na początku linii? Lub "\", które nie jest na końcu linii, ani w środku literału? – rodrigo

+0

@rod a # # to preprocessing-op-or-punc. Symbol \, który nie znajduje się na końcu linii lub wewnątrz literału, wydaje się być możliwy. Mając '#define BAR (X) # X', można powiedzieć' BAR (A \ nB) ', który zawiera identyfikatory' A' i 'nB' rozdzielone przez \ token, dopasowany przez ostatnią kategorię tokena PP (lub implementacja pozwala na identyfikatory zawierające \, będzie to pojedynczy identyfikator). Dzięki za ten wgląd! –

Powiązane problemy