2013-06-09 3 views
6

Я пытаюсь написать конечный автомат, который разрывает исходный файл и разбивает его на разделы, которые являются либо бизнесом компилятора, либо бизнесом препроцессора. Не глубокий обход, я просто ищу разделы, которые являются либо комментариями, либо директивами препроцессора. (без макросов, без условно скомпилированных блоков и т. д.)Где законно указывать директиву препроцессора?

Комментарии достаточно просты, но я не уверен на 100%, когда законно указывать директиву препроцессора. Например, является ли следующая строка законной?

int i; #include <derp.h> 

Есть ли особые случаи, когда разрешены некоторые директивы, а другие нет?

Я искал google и так и не нашел вопроса, который отвечает на это.

Пожалуйста, ответьте за ОБА C и C++, я отметил и намеренно, и намеренно.

+10

Если вы пытаетесь сделать парсер, вы действительно должны использовать окончательную грамматику для языка (то есть стандарт (ы)) , вместо того, чтобы полагаться на ответы, заданные смертоносными смертными здесь, на SO! –

+0

вы даже попробовали Google? – xaxxon

+3

Да, я пробовал Google. Там сказано так, прямо в этом вопросе. – Wug

ответ

11

Директивы препроцессора могут появляться в любом месте, если они являются первым не-пропуском маркера на линии. Соответственно, вы не можете писать

int i; #define ThisIsntLegal SinceItsNotAtTheStart 

Но это было бы:

int i; 
#define Woohoo ThisIsLegal 

Надеется, что это помогает!

C11 Standard (N1570, ISO/IEC 9899:201x) (Соответствующий раздел: s6.10 Prerocessing Директива, страница 160)

+0

У вас есть ссылка на ресурс, который говорит об этом? Anecdotal «бросает его на компилятор и видит, что он делает», тестирование поддерживает это, но я хочу видеть его в письменной форме. : D – Wug

+0

@Wug: Как я уже говорил выше, место, где можно найти это в письменном виде, - это стандартный язык (ы);) –

+1

+1. Если вы хотите ссылку на стандарты, * C11 s6.10 Директивы предварительной обработки *, похоже, охватывают этот – simonc

 Смежные вопросы

  • Нет связанных вопросов^_^