Появление вопросительного знака в коде C - PullRequest
4 голосов
/ 16 марта 2011

Я делаю простую программу, которая должна подсчитывать вхождения троичного оператора ?: в исходном коде C.И я стараюсь максимально упростить это.Итак, я отфильтровал из исходного кода эти вещи:

  1. Строковые литералы ""
  2. Символьные константы ''
  3. Последовательности триграфа ?? =, ?? (,и т. д.
  4. Комментарии
  5. Макросы

А сейчас я только подсчитываю вхождения вопросительных знаков.

Итак, мой вопрос: есть лилюбой другой символ, оператор или что-либо еще, что может вызвать проблемы - содержит '?'?

Предположим, что источник имеет синтаксис действительный.

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Я думаю, что вы нашли все места, где введен знак вопроса, и, следовательно, исключили все возможные ложноположительные результаты (для троичной операции). Но, возможно, вы слишком много исключили: может быть, вы хотите посчитать те "?:", Которые вводятся макросами; Вы не считаете это. Это то, что вы намерены? Если это так, все готово.

3 голосов
/ 16 марта 2011

Запустите инструмент на предварительно обработанном исходном коде (вы можете получить это, запустив, например, gcc -E). Это выполнит все расширения макросов (а также подстановку #include) и исключит все триграфы и комментарии, поэтому ваша работа станет намного проще.

0 голосов
/ 16 марта 2011

В K & R ANSI C единственные места, где вопросительный знак может иметь место:

  1. Строковые литералы ""
  2. Символьные константы ''
  3. Комментарии

Теперь вы можете заметить, что в этом списке отсутствуют макросы и последовательности триграфов.

Я не включил последовательности триграфов, поскольку они являются расширением компилятора, а не "допустимым C".Я не имею в виду, что вы должны удалить чек из вашей программы, я пытаюсь сказать, что вы уже пошли дальше, чем нужно для ANSI C.

Я также не включил макросы, потому что когда вы говоритео символе, который может встречаться в макросах, вы можете иметь в виду две вещи:

  1. Имена / идентификаторы макросов
  2. Тела макросов

The?символ не может встречаться в идентификаторах макросов (/309364/kakovy-dopustimye-simvoly-dlya-imen-makrosov),, и я вижу тела макросов как обычный код C, поэтому первый список (строковые литералы, символьные константы и комментарии *) также должен охватывать их.

* Могут ли макросы корректно содержатькомментарии? Потому что, если я использую это:

#define somemacro 15 // this is a comment

, тогда // this is a comment не является частью макроса. Но что если я скомпилирую этот C-файл с -D somemacro="15 // this is a comment"?

...