2012-10-13 11 views
5

Liczba tokenów w poniższym zestawieniu C.Obliczanie tokenów w oświadczeniu c

printf("i = %d, &i = %x", i, &i); 

Myślę, że jest tu 12 żetonów. Ale moja odpowiedź jest błędna.

Czy ktoś może mi powiedzieć, jak znaleźć tokeny w powyższym stwierdzeniu?

PS: Wiem, że token jest tekstem programu źródłowego, którego kompilator nie rozkłada na elementy składowe.

+1

Co to jest 12 żetonów, które tam widzisz? – Mat

+5

Powiedziałbym, że istnieje 10. 'printf'' ('' "i =% d, & i =% x" '', '' i' ',' 'i' '' ');'; –

+0

Cóż, liczę dziesięć tokenów. W pewnym stopniu zależy to od tego, ile szczegółów zachowuje się i ile się zignoruje. (Czy możliwe jest, że bierzesz pod uwagę tokeny przestrzeni?) Podczas gdy standard C wymaga pewnej interpretacji dla preprocesora, nie musi to wpływać na resztę parsera. – delnan

Odpowiedz

9

Tak dalece, jak rozumieją kodu C analizowania, znaczniki są (10 łącznie):

printf 
(
"i = %d, &i = %x" 
, 
i 
, 
& 
i 
) 
; 

nie liczbę białych przestrzeni, to jest na ogół bez znaczenia i służy jedynie jako separator pomiędzy pozostałych żetonów i nie rozpadają się na literał łańcuchowy na kawałki, ponieważ jest to integralna jednostka sama w sobie.

+0

czym będzie leksemem tego stwierdzenia? –

+0

@rafanadal O czym ty mówisz? –

+0

kk po prostu czym są leksemy –

3

To wygląda bardzo podobnie do przydziału szkoły czy coś, ale w zależności od tego, czy liczby białych: 10 lub 12 (lub 13, jeżeli odstępu liczy i nie ma kończący znak nowej linii)

'printf' '(' '"i = %d, &i = %x"' ',' 'i' ',' '&' 'i' ')' ';' 
    1  2  3    4 5 6 7 8 9 10 
2

tak całkowicie 10 tokenów. Ponieważ znaki, które są reprezentowane w cudzysłowie, mogą być traktowane jako pojedynczy token przez analizator leksykalny (LA), który jest własnością LA.