| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > удалить комментарии из исходников |
| Автор: inside_pointer 4.4.2008, 02:50 | ||
Как найти комментарий в строке, не используя библиотечных функций языка C ?
Можно использовать переменных две штуки, и строки две штуки. |
| Автор: 0lmer 4.4.2008, 06:13 | ||
Мож это какое нить учебное задание и злой препод строго настрого запретил пользоваться либами? |
| Автор: inside_pointer 4.4.2008, 06:24 | ||||
Это всё ещё неизвестно
Тут функции, которые пытаюсь использовать
Пробовал через c = getchar() и т.д., но получилась такая громадина и чем дальше, тем хуже, особенно когда надо двойные кавычки учесть. Тут в результате нужно получить программку в теле понятный блок функций чо-то делает со строкой, и сами функции простые как 2х2, накидал чо-то вроде получается с флажками открытия и закрытия комментария, но чувствуется что это процентов 30% от того что надо наваять. |
| Автор: xvr 4.4.2008, 10:54 | ||||
Хватит и одной переменной, дополнительных строк вообще не надо. Делаешь State Machine, переменная обозначает текущее состояние: Normal - вне строк и коментариев String - внутри строки ("") Char - внутри строки ('') Comment - внутри комментария /* .. */ OneLineComment - внутри комментария // Далее читаешь входной поток по лексемам (что бы определить /* */ //) и меняешь состояние в зависимости от текущего и прочтенной лексемы, если текущее состояние не Comment/OneLineComment - выводишь прочтенную лексему в выходной поток. Сочетание \<любой символ> в состояниях String и Char считаются 2мя обычными символами |
| Автор: inside_pointer 4.4.2008, 11:27 | ||
А это что значит ? Лексема эта должна понимать знак EOF, кто такая лексема и как не дать ей вылезти за край файла ? |
| Автор: Mayk 4.4.2008, 12:24 | ||
только зачем лексер делать руками когда есть lex и готовый ansi-c.l? |
| Автор: Alek86 4.4.2008, 12:45 | ||||||
| Mayk, думаю, имеется в виду самому написать кстати, а по стандарту как компилер должен убрать комменты в таком случае: это:
заменить на это:
или это:
? |
| Автор: Mayk 4.4.2008, 12:48 | ||
Трата времени.
ага. комментарии в си не являются вложенными. |
| Автор: inside_pointer 4.4.2008, 12:51 | ||
Так есть string.h, я бы сделал через неё, надо понять устройство одной из таких функций на примере. И string.h неизвестно и лексер этот твой. |
| Автор: korian 4.4.2008, 13:16 | ||||
ограничения не понял... поэтоу... так правильно?
|
| Автор: Alek86 4.4.2008, 13:28 |
в c++ то же самое? |
| Автор: Mayk 4.4.2008, 13:50 | ||
korian, почти так. надо ещё так чтоб в
/**/ не удалялись. в готовых грамматиках подобные тонкости уже расписаны кстати да. многострочные комментарии не могут быть вложенными |
| Автор: inside_pointer 4.4.2008, 13:56 | ||
| korian, лексема это типа две перменные типа ? cl и cr
Суть в том, чтобы он комментарий вырезал только /*...*/ а не //... И чтобы /*... /*...*/...*/ считалось одним комментарием. Но чтобы эти штуки в строке типа a = "abcd \' \" /* ... /* ... */ ... */abcd \* \" "; не были затронуты. Я попробую сделать как предложил xvr, типа несколько состояний, и лексемы вида две переменные в одной левый символ в другой правый. |
| Автор: korian 4.4.2008, 14:08 |
в задании этого не сказано а так, конечно, чтобы все учесть, надо на лексемы разбивать и работать уже с ними, а не с символами. Добавлено через 1 минуту и 46 секунд ну тогда сначала опишите полностью ваш стандарт комментов... в обычном C/C++ из той строки только это коментарий - /*... /*...*/ Добавлено через 6 минут и 37 секунд лексема - это, так сказать, символ, которым можно оперировать в языке. \n - два символа, но одна лексема. на более высоком уровне: char* a = "string" тут 4 лексемы: тип char* имя переменной a оператор = строка "string" |
| Автор: inside_pointer 4.4.2008, 15:13 |
| То есть лексемы получаются когда строка делится по какому-то символу и в каждой лексеме проводится поиск нужных комбинаций, это то есть делается цикл который обрабатывает каждую лексему, во вроде то что нужно, этого я не знал. Спасибо, korian, за разъяснения, терь вижу алгоритм. |
| Автор: inside_pointer 5.4.2008, 03:35 | ||
Вот короче получилось.
|
| Автор: xvr 5.4.2008, 21:57 | ||||
Неправильно получилось:
|