Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удалить комментарии из исходников 
V
    Опции темы
inside_pointer
Дата 4.4.2008, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Как найти комментарий в строке, не используя библиотечных функций языка C ?

Код


    /* этот */

/* этот */

char str[] = "    /* это не трогать */     ";

/*
 *    вот этот вот,
 *    такой вот,
 *    длинный
 */



Можно использовать переменных две штуки, и строки две штуки.

Это сообщение отредактировал(а) inside_pointer - 4.4.2008, 02:53
PM MAIL   Вверх
Mayk
Дата 4.4.2008, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(inside_pointer @  4.4.2008,  06:50 Найти цитируемый пост)

Можно использовать переменных две штуки, и строки две штуки.

А можно не страдать фигнёй и использовать либы предоставляющи perl-овые regexp'ы или хотя бы тупо прогнать через lex?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
0lmer
Дата 4.4.2008, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 3.12.2006

Репутация: нет
Всего: -1



Цитата(Mayk @  4.4.2008,  05:50 Найти цитируемый пост)
А можно не страдать фигнёй и использовать либы предоставляющи perl-овые regexp'ы или хотя бы тупо прогнать через lex?


Мож это какое нить учебное задание и злой препод строго настрого запретил пользоваться либами?
PM   Вверх
inside_pointer
Дата 4.4.2008, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Это всё ещё неизвестно

Код


copy(search, line);
                
        reverse(search);
            clearline(search);
                if (search[0] == '/' && search[1] == '*') {
                    if (close == OFF)
                        close = ON;
                reverse(search);
                    clearline(search);
                        if (search[0] == '/' && search[1] == '*')
                            if (open == OFF)
                                open = ON;
                }            
        

if ((open == OFF && close == OFF) || (open == ON && close == ON))



Тут функции, которые пытаюсь использовать
Код

/* copy: копирует строку 'from' в 'to'; длина to считается достаточной */
void copy(char to[], char from[])
{
    int i;
    
    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

/* clearline: стирает лишние пробельные символы в конце строки */
int clearline(char s[])
{
    int c, i;
    
    for (i = 0; s[i] != '\n'; ++i)
        ;
    while (s[i] == '\n' || s[i] == ' ' || s[i] == '\t')
        if (i > 0)
            --i;
        else
            return 1;
    
    s[++i] = '\n';
    s[++i] = '\0';
    return i;
}

/* reverse: считывает строку в s, обращает её */
void reverse(char s[])
{
    int i, step, save;
    for (i = 0; s[i] != '\0'; ++i)
        ;
    if (s[i-1] == '\n')
        --i;
    for (step = 0; step < i / 2; ++step) {
        save = s[step];
        s[step] = s[i-1-step];
        s[i-1-step] = save;
    }
}


Пробовал через c = getchar() и т.д., но получилась такая громадина и чем дальше, тем хуже, особенно когда надо двойные кавычки учесть.

Тут в результате нужно получить программку в теле понятный блок функций чо-то делает со строкой, и сами функции простые как 2х2, накидал чо-то вроде получается с флажками открытия и закрытия комментария, но чувствуется что это процентов 30% от того что надо наваять.
PM MAIL   Вверх
xvr
Дата 4.4.2008, 10:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(inside_pointer @ 4.4.2008,  02:50)
Как найти комментарий в строке, не используя библиотечных функций языка C ?

Код


    /* этот */

/* этот */

char str[] = "    /* это не трогать */     ";

/*
 *    вот этот вот,
 *    такой вот,
 *    длинный
 */



Можно использовать переменных две штуки, и строки две штуки.

Хватит и одной переменной, дополнительных строк вообще не надо.
Делаешь State Machine, переменная обозначает текущее состояние:
Normal - вне строк и коментариев
String - внутри строки ("")
Char - внутри строки ('')
Comment - внутри комментария /* .. */
OneLineComment - внутри комментария //
Далее читаешь входной поток по лексемам (что бы определить /* */ //) и меняешь состояние в зависимости от текущего и прочтенной лексемы, если текущее состояние не Comment/OneLineComment - выводишь прочтенную лексему в выходной поток.
Сочетание \<любой символ> в состояниях String и Char считаются 2мя обычными символами

PM MAIL   Вверх
inside_pointer
Дата 4.4.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(xvr)

Далее читаешь входной поток по лексемам 

А это что значит ?

Лексема эта должна понимать знак EOF, кто такая лексема и как не дать ей вылезти за край файла ?
PM MAIL   Вверх
Mayk
Дата 4.4.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(xvr @  4.4.2008,  14:54 Найти цитируемый пост)

Хватит и одной переменной, дополнительных строк вообще не надо.
Делаешь State Machine, переменная обозначает текущее состояние:

только зачем лексер делать руками когда есть lex и готовый ansi-c.l? 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Alek86
Дата 4.4.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Mayk
Цитата(inside_pointer @  4.4.2008,  02:50 Найти цитируемый пост)
 не используя библиотечных функций языка C ?

думаю, имеется в виду самому написать


кстати, а по стандарту как компилер должен убрать комменты в таком случае:
это:
Код
111 /* /* 222 */ */ 333

заменить на это:
Код
111 */ 333

или это:
Код
111  333

?



--------------------
user posted image    user posted image
PM MAIL   Вверх
Mayk
Дата 4.4.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Alek86 @  4.4.2008,  16:45 Найти цитируемый пост)

думаю, имеется в виду самому написать

Трата времени.

Цитата(Alek86 @  4.4.2008,  16:45 Найти цитируемый пост)

кстати, а по стандарту как компилер должен убрать комменты в таком случае:
это:
Выделить всёкод C++
1:
    
111 /* /* 222 */ */ 333

заменить на это:
Выделить всёкод C++
1:
    
111 */ 333

ага. комментарии в си не являются вложенными. 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
inside_pointer
Дата 4.4.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(Mayk)

только зачем лексер делать руками когда есть lex и готовый ansi-c.l?  

Так есть string.h, я бы сделал через неё, надо понять устройство одной из таких функций на примере. И string.h неизвестно и лексер этот твой.
PM MAIL   Вверх
korian
Дата 4.4.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(inside_pointer @  4.4.2008,  01:50 Найти цитируемый пост)
Можно использовать переменных две штуки, и строки две штуки.

ограничения не понял...
поэтоу... так правильно?
Код

void commentEraser(char* string)
{
    for (char* curchar = string; curchar[0] != 0; ++curchar)
    {
        if (curchar[0] == '/' && curchar[1] == '*')
        {
            for (curchar += 2; curchar[0] != 0 && (curchar[0] != '*' || curchar[1] != '/'); ++curchar) ;
            if (curchar[0] == 0)
                throw "bad comment";
            ++curchar;
            continue;
        }
        if (curchar[0] == '/' && curchar[1] == '/')
        {
            for (curchar += 2; curchar[0] != 0 && curchar[0] != '\n'; ++curchar) ;
            if (curchar[0] == 0)
                break;
        }
        if (curchar[0] == '"')
        {
            *string++ = *curchar;
            for (++curchar; curchar[0] != 0 && curchar[0] != '"'; ++curchar)
                *string++ = *curchar;
            *string++ = *curchar;

            if (curchar[0] == 0)
                throw "bad string";
            continue;
        }
        *string++ = *curchar;
    }
    *string = 0;
}



Это сообщение отредактировал(а) korian - 4.4.2008, 13:49
PM   Вверх
Alek86
Дата 4.4.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Mayk @  4.4.2008,  12:48 Найти цитируемый пост)
 комментарии в си не являются вложенными. 

в c++ то же самое?


--------------------
user posted image    user posted image
PM MAIL   Вверх
Mayk
Дата 4.4.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



korian,  почти так. надо ещё так чтоб в 
Код

const char* str =" \" /* */";

/**/ не удалялись. 


в готовых грамматиках подобные тонкости уже расписаны кстати
 

Цитата(Alek86 @  4.4.2008,  17:28 Найти цитируемый пост)
в c++ то же самое? 

да.  многострочные комментарии не могут быть вложенными


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
inside_pointer
Дата 4.4.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



korian, лексема это типа две перменные типа ?

cl и cr

Код

for (i = 0; (c = line[i]) != '\0'; ++i)
    if ((cl = line[j]) == '/' && (cr = line[j+1]) == '*')
        выставить состояние флага, типа вход в комментарий произошёл


Суть в том, чтобы он комментарий вырезал только /*...*/ а не //...
И чтобы /*... /*...*/...*/ считалось одним комментарием.
Но чтобы эти штуки в строке типа a = "abcd \' \" /* ... /* ...  */  ...  */abcd \* \" ";
не были затронуты.

Я попробую сделать как предложил xvr, типа несколько состояний, и лексемы вида две переменные в одной левый символ в другой правый.
PM MAIL   Вверх
korian
Дата 4.4.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(Mayk @  4.4.2008,  12:50 Найти цитируемый пост)
/**/ не удалялись. 

в задании этого не сказано  smile 
а так, конечно, чтобы все учесть, надо на лексемы разбивать и работать уже с ними, а не с символами.

Добавлено через 1 минуту и 46 секунд
Цитата(inside_pointer @  4.4.2008,  12:56 Найти цитируемый пост)
И чтобы /*... /*...*/...*/ считалось одним комментарием.

ну тогда сначала опишите полностью ваш стандарт комментов...
в обычном C/C++ из той строки только это коментарий - /*... /*...*/

Добавлено через 6 минут и 37 секунд
лексема - это, так сказать, символ, которым можно оперировать в языке.
\n - два символа, но одна лексема.

на более высоком уровне:
char* a = "string"
тут 4 лексемы:
тип char*
имя переменной a
оператор =
строка "string"

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1003 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.