Удаление комментариев из строки с помощью NSScanner? - PullRequest
0 голосов
/ 11 ноября 2009

У меня есть строка, которая может включать или не включать в нее комментарии C ++ (многострочные и однострочные), и мне нужно вырезать эти комментарии, прежде чем я смогу использовать эту строку. Моя текущая идея состоит в том, чтобы использовать NSScanner для этого - найти позицию открытия и закрытия многострочных комментариев и удалить эту часть строки, найти позицию открытия однострочных комментариев и символов EOL, а также удалить эту часть строки .

Вы бы сделали это по-другому? Каков будет ваш подход? Если это имеет значение, размер строки может составлять несколько мегабайт, поэтому проблема заключается в производительности.

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

С этой темы , я подумал, что лучшее предложение - запустить строку через препроцессор C ++.

0 голосов
/ 23 ноября 2009

Мое решение:

Просмотрите строку с помощью NSScanner и отметьте положение каждого многострочного и одиночного комментария и всех строк (что угодно, между одинарными и двойными кавычками). Сохраните позиции в массиве NSValues, которые представляют диапазоны каждого элемента.

Затем выполните итерацию по массиву комментариев, убедившись, что каждый комментарий не находится внутри строки. Чтобы проверить это, убедитесь, что местоположение каждого комментария не больше местоположения каждой строки, а местоположение комментария не попадает в положение + длина каждой строки.

И вуаля. Все, что не попадает в список, может быть безопасно удалено, поскольку оно является действительным комментарием.

0 голосов
/ 12 ноября 2009

Не забудьте также отслеживать кавычки. Тестовые случаи:

  • "/*Ceci n'est pas une commentaire*/"
  • '/**/' (Mac OS / Mac OS X OSType литерал)
  • '//!\n'
  • "This string does not contain a // comment"

Во всех этих случаях вы не должны обнаруживать комментарий.

Верно и обратное:

  • //Ceci n'est pas une "string"
  • /*This comment does not contain an OS'Type' literal*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...