#define, редактирование текста
Приветствую. Учусь на первом курсе, и к сессии получил такое задание:
Необходимо сделать программу, которая открывает какие-либо .cpp файлы, ищет в них #define, в которых описаны некоторые константы (например k = 5), если находит, то далее программа проходится по всему коду, и заменяет встреченные константы k на число 5 (т.е. for (int i = 0; i < k; ++i) просто превратится в for (int i = 0; i < 5; ++i)). Собственно таким образом и работает сам #define, а мне необходимо повторить. Вот только проблема в том, что я совершенно не имею понятия, как это сделать. То есть, открыть файл и найти в нем эту константу я еще смогу, но каким образом потом заменять? Спасите
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Akiv Doros
- 11 ноября 2024 г. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50баллов,
- Очки рейтинга-4
- molni99
- 26 октября 2024 г. 1:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80баллов,
- Очки рейтинга4
- molni99
- 26 октября 2024 г. 1:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20баллов,
- Очки рейтинга-10
Как вариант читаешь построчно и меняешь, записываешь в файл
Добрый день!
Можно считать файл, весь или построчно, как предложили выше, использовть регулярку и заменить с помощью неё интересующие места в тексте. А потом записать всё в новый файл.
Например, так
Доброго времени суток, Евгений! Думаю, что они на 1м курсе проходят visual studio. Наверняка код, написанный с помощью библиотек Qt ему не поможет. В ВУЗах,насколько мне известно, Qt изучают в разделе прикладного программирования.
Добрый день!
Я бы с вами согласился, но человек задал вопрос в разделе Qt, а помимо этого ещё и тег Qt добавил, если с разделом можно ошибиться, то думаю, что с тегом уже вряд ли. Так что мой ответ в данном контексте вполне уместен должен быть.
Упс, прошу прощения, перепутал разделы и на тег не глянул..))
Ну, не знаю как у других, но у меня на первом курсе идет Qt, и вот такая вот ерунда
Эх, если бы все было так просто. Штука же не в том, чтобы просто заменить текст, а заменить именно ту константу и только её. А в вашей реализации заменяются вообще любые символы 'k' на 5. В том и заключается сложность, чтобы каким-то образом отделить обычные буквы 'k', например, в названии функции, от нашей константы
Я полагал, что всё будет гораздо сложнее, но это уже будет зависеть от вашей конкретной реализации, конкретного кода, который нужно обработать, и сложности регулярного выражения, которое будете использовать. Для парсинга нет универсального решения в принципе. А что касается дефайнов, то они хотя бы стандартизированы в рамках языка программирования, поэтому парсер линковщика с ними справляется, а что касается констант, то тут уж вам нужно будет продумывать отдельные случаи, или отталкиваться от синтаксиса и конструкций языка. По сути нужно написать синтаксический анализ, как в IDE. Увы, но здесь уложиться простым парсингом не выйдет, если только у вас нет ограниченного набора случаев, но просто константа k .... На простое задание в университете это не похоже, если нужно парсить константы, имя которых состоит из одной лишь буквы. Это курсовая?
Если бы курсовая. Нет, просто дело в том, что мой преподаватель очень меня любит, потому, собственно, первая же моя сессия переменилась с обычных ответов на вопросы с билетов на вот это..
А что всё-таки по теме можете сказать? Есть идеи? Я постараюсь сегодня узнать, на сколько строги условия (возможно, константа всегда будет описана на какой-нибудь 6 строке, или типа того)
Если по теме, то по максимуму уточняйте информацию о задании. Честно, найти букву и заменить - это значит тыкаться в эту букву везде и проверять не является ли она частью имени атрибута, класса или ещё неизвестно чего.
Уточните важный момент. Из того кода, что вы привели, я вижу, что k и kkk объявлены в define, если нужно искать именно текстовые значения, которые объявлены в данных секциях, то задача сужается. Возможно, хватит анализа дефайнов и попытке нахождения совпадений.
Тогда задача будет состоять из нескольких шагов.
Спросите преподавателя, обрисуйте ему эти шаги, как вы это "понимаете" и возможно он даст вам дополнительную информацию и кое-какие подсказки.
Да, точно. вы уточняли про дефайны в вопросе, я не обратил внимания. Ну сути это не меняет. Обрисуйте шаги преподавателю, уточните, правильно ли вы поняли задание в соответсвии с шагами, которы я вам написал. Уточните, достаточно ли будет использовать для этого регулярные выражения.
Главное, чтобы ваш преподаватель также не был пользователем этого сайта :D
А то влетит вам потом )) Как никак это практически единственный достаточно активный и живой русскоязычный ресурс по Qt
Собственно, ничего нового он не сказал. Define могут находиться в любом месте, задание я понял правильно, из подсказок никаких нормальных не дал, только то, о чем я думал и сам - проверять, чтобы символы слева и справа входили в перечень допустимых (типа скобки, знаки равенства\неравенства, и все такое).
Ну смотрите, первый шаг - это считать дефайны.
Считать нужно будет построчно, сделать это можно так, если это файл.
Если это QTextEdit или QPlainTextEdt, то можно считать всё и разбить на строки
Дальше регуляркой проходитесь по каждой строке и ищите там этот самый дефайн, выбираете его значение и сохраняете в какой-нибудь QVector<QString>, это будет пул дефайнов на замену.
А вторым шагом с помощью регулярок, как я изначально написал пробуете заменить всё в тексте с учётом допустимых символов. Попробуйте сами написать соответствующие регулярные выражения.
Ну. Часть работы сделано. Меня почти похвалили. Главная проблема - что он не читает макросы. То есть, если будет запись вида #define max(x,y) (x>y)?x:y , то при встрече в коде участка типа max(a,2444), оно должно заменить (a>2444)?a:2444. А как - не понятно. Ну и еще я не могу сделать замену дефайна по строкам, то есть оно меняет сразу через весь текст, а если делать через QStringList - почему-то умирает
Имхо. надо искать исходник компилятора и брать код оттуда :-)
Но если серьезно, то действительно помощь нужна. Мне по-хорошему нужно сдать это в понедельник