2013-06-09 10 views
6

Próbuję napisać maszynę stanu, która wyłudza plik źródłowy i dzieli go na sekcje, które są albo biznesem kompilatora, albo biznesem preprocesora. Nie jest to głębokie przejście, szukam tylko sekcji, które są komentarzami lub dyrektywami preprocesora. (brak makr, brak kompilacji warunkowo bloków itp.)Gdzie jest legalne określenie dyrektywy preprocesora?

Komentarze są dość proste, ale nie jestem w 100% pewny, gdzie dozwolone jest określenie dyrektywy preprocesora. Na przykład, czy poniższy wiersz jest legalny?

int i; #include <derp.h> 

Czy są jakieś specjalne przypadki, w których niektóre dyrektywy są dozwolone, a inne nie?

Szukałem google i SO i nie znalazłem odpowiedzi na to pytanie.

Proszę odpowiedzieć dla OBU C i C++, oznaczyłem świadomie i celowo.

+10

Jeśli próbujesz dokonać parsera, to naprawdę powinien być pomocą ostateczne gramatyki dla języka (czyli standardowe (s)) , zamiast polegać na odpowiedziach udzielonych przez omylnych śmiertelników tutaj na SO! –

+0

Czy próbowałeś już google? – xaxxon

+3

Tak, próbowałem google. Mówi tak, właśnie w tym pytaniu. – Wug

Odpowiedz

11

Dyrektywy preprocesora mogą pojawiać się w dowolnym miejscu, o ile są pierwszymi nie-białymi znakami na linii. W związku z powyższym, nie można napisać

int i; #define ThisIsntLegal SinceItsNotAtTheStart 

Ale to byłoby:

int i; 
#define Woohoo ThisIsLegal 

Nadzieja to pomaga!

C11 Standard (N1570, ISO/IEC 9899:201x) (odpowiedniej sekcji: s6.10 Prerocessing Dyrektywy, strona 160)

+0

Czy masz link do zasobu, który mówi to? Anegdota "wyślij to do kompilatora i zobacz, co robi" testowanie obsługuje to, ale chcę to zobaczyć na piśmie. : D – Wug

+0

@Wug: Jak zasugerowałem powyżej, miejscem, w którym można znaleźć to na piśmie, jest standard (y) językowy;) –

+1

+1. Jeśli chcesz uzyskać link do standardu, * C11 s6.10 Wytyczne dotyczące przetwarzania wstępnego * wydają się obejmować to – simonc

Powiązane problemy