
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (79) « Первая ... 77 78 [79] ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#1171
,
|
|
Почему это? Не будет. \, предшествующий ", маскирует конец литерала и означает просто символ " как его элемент, тогда как если этому \ предшествует ещё один \, то это означает просто символ \ как элемент литерала, и если следом идёт ", то это его граница. Если мы видим \\\, то первые два означают просто \, а последний является модификатором следующего символа, и какой-то смысл они имеют только совместно. \\\" означает два обычных символа \ и ", не специальных, \\\t означает \ и TAB итп
|
Сообщ.
#1172
,
|
|
|
Проверю.
![]() ![]() $ cat test.cpp #include <iostream> int main() { std::cout << "Test \\\"; return 0; } $ g++ -o test test.cpp test.cpp:4:22: предупреждение: отсутствует завершающий символ " 4 | std::cout << "Test \\\"; | ^ test.cpp:4:22: ошибка: отсутствует терминирующий символ " 4 | std::cout << "Test \\\"; | ^~~~~~~~~~~ test.cpp: In function «int main()»: test.cpp:5:9: ошибка: expected primary-expression before «return» 5 | return 0; | ^~~~~~ $ cat test.cpp #include <iostream> int main() { std::cout << "Test \\\\"; return 0; } $ g++ -o test test.cpp $ ./test Test \\$ |
Сообщ.
#1173
,
|
|
|
Да, это проблемы раскрашивателя кода. Он не учитывает, что комментарии не могут начинаться, и не могут заканчиваться внутри строковых и символьных литералов. Цитата macomics @ Судя по этому утверждению, тогда "\\\" должен быть завершенной строкой. Но не будет. Стоило сказать про нечетное количество \. Проще не заморачиваться количеством или чётностью. А просто определиться с обработкой. Символ \ может участвовать: Экранирование Работает только внутри литералов. Символ \ может экранировать " или ' или \ Escape-преобразования Работают только внутри литералов. Всем известные \n \r \t \a \0 \x42 .... Компилятор сканирует код посимвольно. Встречая символы, которые могут иметь и обычное, и управляющее значение. Компилятор, в процессе сканирования, "назначает" встретившему символу "роль" (обычный или управляющий) в зависимости от ряда состояний. |
Сообщ.
#1174
,
|
|
|
Цитата Qraizer @ Не всё, что внутри /**/ или //EOL, является комментом, а только то, что не в строковом литерале. Крайне подозрительное утверждение. Внутри комментариев - не может быть литералов. И если мы что-то решили закомментировать (я имею ввиду по правилам), то любые литералы автоматом превращаются в комментарии. |
![]() |
Сообщ.
#1175
,
|
|
Majestio, ну да. Это и означает, что
![]() ![]() std::cout << "Тут я не должна заменяться, даже /* если я размещу её */ вот так"; // в отличие от "Тут я должна быть \ заменена", потому что это всё ещё коммент |
Сообщ.
#1176
,
|
|
|
Qraizer, склейка строк не спасет от неправильности твоего этого утверждения.
Хотя нет, не от неправильности. Твое это утверждение отчасти верно. Просто оно записано так, что несколько ломает причинно-следственные связи ![]() |
![]() |
Сообщ.
#1177
,
|
|
В чём именно ты видишь неправильность? Я не собирался описывать алгоритм, хошь сырцов?, они есть. Я описал спектр учитываемых аспектов. Естественно их не следует применять в описанном порядке. Давайте не будем душнить. Плз.
|
Сообщ.
#1178
,
|
|
|
Цитата Qraizer @ В чём именно ты видишь неправильность? Ну я же написал выше. Не неправильность, а скорее запутанность. Проще написать, что внутри литералов не может быть комментов, равно как и внутри комментов не может быть литералов. Тогда всё ясно и понятно. И да, давай не будем душнить =) |
Сообщ.
#1179
,
|
|
|
Qraizer, тебе квест!
![]() Цитата Qraizer @ Как-то пришлось писать утилю, которая заменяла все я на Я, потому как используемая тулза (инструментатор исходного кода под: сбор структурного покрытия; сбор информации WCET, анализ потоков данных и/или управления; оценка наихудшего использования стека) на ASCII символах == 0xFF бажила. (Дело не в русской букве, а именно коде символа. В европейских кодировках на этом символе тот же баг.) Так это было целое приключение, т.к. заменять всё было нельзя, только в комментах. А то, что в строках, нужно оставить нетронутым, иначе меняется поведение кода, благо на таких тулза не бажила. В итоге это вылилось в весьма нетривиальный алгоритм. Я уверен, что сей велосипед ты навелосипедил на все 100% правильно. Но ты тогда, imho, пошел самым упоротым путем. Ибо для таких задач уже давно существовали специальные решения. А именно связка либ - bison (1985) + flex (1987). Генераторы парсеров и лексические анализаторы в лице вышеупомянутых либ. Слабо изучить матчасть и перевести свой код под эти "платформы"? Скрытый текст заодно и мы поучимся ... а? |
![]() |
Сообщ.
#1180
,
|
|
Зачем такое старьё, если есть boost::spirit
![]() |
Сообщ.
#1181
,
|
|
|
Bison + Flex однозначно лучше, когда требуется максимальная производительность парсинга для обработки больших входных данных, а грамматика подходит для LALR, так как они генерируют оптимизированный C-код, который работает быстрее, чем парсеры, созданные с помощью Boost::Spirit.
|
![]() |
Сообщ.
#1182
,
|
|
Ну я бы не был так категоричен на предмет производительности. Другое дело, компиляция...
![]() Та и в целом, меня напрягает любой автоматически непонятно кем непонятно как генерируемый код, вставляемый в мой проект. Никсоидам может быть и нормуль, когда make генерит makefile, по которому make генерит три makefile, по которым make генерит N makefiles для сборки N/3 пререквизитов, по которым рекурсивно процесс повторяется для сборки пререквизитов, ещё один собирает собственно проект с пререквизитами и ещё один конфигурит и инсталит, и поэтому им нормуль, когда половина пререквизитов автогенерится своими makefile, точнее, их половиной, тогда как вторая половина их собственно собирает... а, не, половина от N/3... ![]() |