Триграфы выпилили из стандарта крестов в последнем, так что можно больше не поддерживать
Zheka_Dnepr
Зачем эта прога? И зачем писал?
programina
> Отправим программу вычищалку на свой емайл.
А он сама запустилась и все вычистила вместе кредитками. Годно, поддержу проэкт
Zefick
> Что именно не правильно? Ты придумал пример, и даже не знаешь, как он
> работает?
Есть код:
int main() { /* char* d ="/*\ \ //\ */const char* t= "wrong"; */ const char* t= "good";
Комментарием в данном коде является только:
/*
char* d ="/*\
\
//\
*/Тоесть после удаления комментариев должен остаться следующий код:
int main() { const char* t= "wrong"; */ const char* t= "good";
Конечно он не валиден и в нормальных компиляторах не компилируется, но gcc это хавает.
Che@ter
> Комментарием в данном коде является только
Нет, комментария тут на самом деле даже два, а не один (что отлично видно в моих тестах). Как ты это вообще додумался написать, если не понимаешь ничего? GCC это нормально обрабатывает, у меня тоже получилось. Совпадение? Не думаю.
Che@ter
gcc, icc и студия компиляют, только шланг зафейлился
Ясно, когда я тестировал в студии, этот код был с табуляцией и
/*
char* d ="/*\
\
/Не воспринимался одним комментарием, так как между * и / был символ табуляции...
Без табуляции таки да, это один коммент. Я чот провтыкал этот момент.
Zheka_Dnepr
> дай пасты почитать что это такое?
http://alenacpp.blogspot.ru/2006/02/blog-post.html
laMer007
> Триграфы выпилили из стандарта крестов в последнем, так что можно больше не
> поддерживать
В последнем это каком? В каком-нибудь С++51?
laMer007
>Триграфы выпилили из стандарта крестов в последнем, так что можно больше не поддерживать
Линк? В n3797 ещё есть.
Hardcode
> gcc, icc и студия компиляют
А редактор студии подсвечивает нормально? 2005 у меня лажает.
laMer007
> Зачем эта прога? И зачем писал?
для проекта http://findmelody.org много г...на в виде комментариев удалил, искал сначала решение в интернете, ничего похожего не нашел, написал свой код, потом подумал, что решение скидывать свои коды на сторонний ресурс - не правильное, опасное, и запилил на одном из своих доменов этот скрипт, чтобы коды теперь я не скидывал, а мне скидывали
Zheka_Dnepr
Хохо... Проси скидывать всем проектом с мейкфайлами
entryway
Я в http://rextester.com/ и в http://gcc.godbolt.org/ проверял
О, я недавно писал удаление комментов в рамках другой, более обширной задачи.
Моё решение адекватно работает с вложенными комментариями, бекслешами в конце строки и строковыми литералами.
Обработку триграфов, правда, добавлять не стал, так как они скоро устареют. Выглядит так:
const std::string singleLineComment = "//.*"; const std::string multiLineComment = "[/][*][^]*?[*][/]"; const std::string charLiteral = "'(\\\\'|[^'])*?'"; // '(\\'|[^'])*?' const std::string stringLiteral = "\"(\\\\\"|[^\"])*?\""; // "(\\"|[^"])*?" const std::string comments = "(" + singleLineComment + ")|(" + multiLineComment + ")"; const std::string literals = "(" + charLiteral + ")|(" + stringLiteral + ")"; const std::string lineContinuation = "\\\\\\n"; // \\\n void spliceLines(std::string& text) { text = std::regex_replace( text, std::regex( lineContinuation), ""); } void removeComments( std::string& text) { auto reg = std::regex( comments + "|" + literals); std::match_results<std::string::iterator> match; auto it = std::begin( text); do { auto result = std::regex_search( it, std::end( text), match, reg); if ( result) { if ( match[1].matched || match[2].matched) // is comment { it = text.erase( match[0].first, match[0].second); } else { it = match[0].second; } } else { break; } } while ( true); } spliceLines( text); removeComments( text);
Зачем удалять комментарии в коде? Экзешник меньше получается да? :)
RadianTOR
Ну я С++11 атрибуты у классов и полей самостоятельно обрабатываю для своих нужд. Проэтому пришлось хотя бы в общих чертах распарсить С++.
Тема в архиве.