![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
Как найти комментарий в строке, не используя библиотечных функций языка C ?
Можно использовать переменных две штуки, и строки две штуки. Это сообщение отредактировал(а) inside_pointer - 4.4.2008, 02:53 |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
А можно не страдать фигнёй и использовать либы предоставляющи perl-овые regexp'ы или хотя бы тупо прогнать через lex? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
0lmer |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 3.12.2006 Репутация: нет Всего: -1 |
||||
|
||||
inside_pointer |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
Это всё ещё неизвестно
Тут функции, которые пытаюсь использовать
Пробовал через c = getchar() и т.д., но получилась такая громадина и чем дальше, тем хуже, особенно когда надо двойные кавычки учесть. Тут в результате нужно получить программку в теле понятный блок функций чо-то делает со строкой, и сами функции простые как 2х2, накидал чо-то вроде получается с флажками открытия и закрытия комментария, но чувствуется что это процентов 30% от того что надо наваять. |
||||
|
|||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Хватит и одной переменной, дополнительных строк вообще не надо. Делаешь State Machine, переменная обозначает текущее состояние: Normal - вне строк и коментариев String - внутри строки ("") Char - внутри строки ('') Comment - внутри комментария /* .. */ OneLineComment - внутри комментария // Далее читаешь входной поток по лексемам (что бы определить /* */ //) и меняешь состояние в зависимости от текущего и прочтенной лексемы, если текущее состояние не Comment/OneLineComment - выводишь прочтенную лексему в выходной поток. Сочетание \<любой символ> в состояниях String и Char считаются 2мя обычными символами |
||||
|
|||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
А это что значит ? Лексема эта должна понимать знак EOF, кто такая лексема и как не дать ей вылезти за край файла ? |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
только зачем лексер делать руками когда есть lex и готовый ansi-c.l? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Alek86 |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
Mayk,
думаю, имеется в виду самому написать кстати, а по стандарту как компилер должен убрать комменты в таком случае: это:
заменить на это:
или это:
? |
||||||
|
|||||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Трата времени. ага. комментарии в си не являются вложенными. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
Так есть string.h, я бы сделал через неё, надо понять устройство одной из таких функций на примере. И string.h неизвестно и лексер этот твой. |
|||
|
||||
korian |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
ограничения не понял... поэтоу... так правильно?
Это сообщение отредактировал(а) korian - 4.4.2008, 13:49 |
||||
|
|||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
||||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
korian, почти так. надо ещё так чтоб в
/**/ не удалялись. в готовых грамматиках подобные тонкости уже расписаны кстати да. многострочные комментарии не могут быть вложенными -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
korian, лексема это типа две перменные типа ?
cl и cr
Суть в том, чтобы он комментарий вырезал только /*...*/ а не //... И чтобы /*... /*...*/...*/ считалось одним комментарием. Но чтобы эти штуки в строке типа a = "abcd \' \" /* ... /* ... */ ... */abcd \* \" "; не были затронуты. Я попробую сделать как предложил xvr, типа несколько состояний, и лексемы вида две переменные в одной левый символ в другой правый. |
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
в задании этого не сказано ![]() а так, конечно, чтобы все учесть, надо на лексемы разбивать и работать уже с ними, а не с символами. Добавлено через 1 минуту и 46 секунд ну тогда сначала опишите полностью ваш стандарт комментов... в обычном C/C++ из той строки только это коментарий - /*... /*...*/ Добавлено через 6 минут и 37 секунд лексема - это, так сказать, символ, которым можно оперировать в языке. \n - два символа, но одна лексема. на более высоком уровне: char* a = "string" тут 4 лексемы: тип char* имя переменной a оператор = строка "string" |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
То есть лексемы получаются когда строка делится по какому-то символу и в каждой лексеме проводится поиск нужных комбинаций, это то есть делается цикл который обрабатывает каждую лексему, во вроде то что нужно, этого я не знал.
Спасибо, korian, за разъяснения, терь вижу алгоритм. |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
Вот короче получилось.
|
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Неправильно получилось:
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |