Обработка cpp файла
От: Аноним  
Дата: 11.10.05 08:48
Оценка: :)
Люди учусь я на программиста и задали мне написать программу,
которая зарагружает сpp файл и определяет скока в ней была объявлена переменых.
Помоготи плз в написаний этой программы а то в голову нечего нормально не приходит.
Зарание спасиба!!!
P.S Проблема в том что переменая может быть объявлена в током виде: "int a=3,f,b=a;";
P.S Под Microsoft c++ (под консоль).
Re: Обработка cpp файла
От: GregZ СССР  
Дата: 11.10.05 08:51
Оценка: 1 (1) +3 :)))
Здравствуйте, Аноним, Вы писали:

А>Люди учусь я на программиста и задали мне написать программу,

А>которая зарагружает сpp файл и определяет скока в ней была объявлена переменых.
А>Помоготи плз в написаний этой программы а то в голову нечего нормально не приходит.
А>Зарание спасиба!!!
А>P.S Проблема в том что переменая может быть объявлена в током виде: "int a=3,f,b=a;";
А>P.S Под Microsoft c++ (под консоль).

Обращайся: http://rentacoder.com
Re: Обработка cpp файла
От: jazzer Россия Skype: enerjazzer
Дата: 11.10.05 10:26
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Люди учусь я на программиста и задали мне написать программу,

А>которая зарагружает сpp файл и определяет скока в ней была объявлена переменых.
А>Помоготи плз в написаний этой программы а то в голову нечего нормально не приходит.
А>Зарание спасиба!!!
А>P.S Проблема в том что переменая может быть объявлена в током виде: "int a=3,f,b=a;";
А>P.S Под Microsoft c++ (под консоль).

Ну что, бери грамматику языка, как она описана в Стандарте, и вперед, пиши синтаксический анализатор.
По-хорошему, тебе нужно, чтобы он все корректно парсил (ничего при этом не делая), а реагировал только на объявления переменных (что тебе и нужно) и типов (чтобы корректно распознавать объявления этих переменных).

В принципе, кто-то извращался на boost::spirit на эту тему, поищи там, вроде, пытались впихнуть в него грамматику
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Обработка cpp файла
От: srggal Украина  
Дата: 11.10.05 11:40
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Ну что, бери грамматику языка, как она описана в Стандарте, и вперед, пиши синтаксический анализатор.

J>По-хорошему, тебе нужно, чтобы он все корректно парсил (ничего при этом не делая), а реагировал только на объявления переменных (что тебе и нужно) и типов (чтобы корректно распознавать объявления этих переменных).

J>В принципе, кто-то извращался на boost::spirit на эту тему, поищи там, вроде, пытались впихнуть в него грамматику


Исходники ctags помогут начинающему коллеге, я так Думаю
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: Обработка cpp файла
От: Glоbus Украина  
Дата: 11.10.05 12:12
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Ну что, бери грамматику языка, как она описана в Стандарте, и вперед, пиши синтаксический анализатор.

J>По-хорошему, тебе нужно, чтобы он все корректно парсил (ничего при этом не делая), а реагировал только на объявления переменных (что тебе и нужно) и типов (чтобы корректно распознавать объявления этих переменных).

Нужно еще чтобы он реагировал на объявления классов, структур и typedef'оф — при это заполнял себе табличку символов
Удачи тебе, браток!
Re[3]: Обработка cpp файла
От: aton Россия http://ruby.inuse.ru
Дата: 11.10.05 12:55
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, jazzer, Вы писали:


J>>Ну что, бери грамматику языка, как она описана в Стандарте, и вперед, пиши синтаксический анализатор.

J>>По-хорошему, тебе нужно, чтобы он все корректно парсил (ничего при этом не делая), а реагировал только на объявления переменных (что тебе и нужно) и типов (чтобы корректно распознавать объявления этих переменных).

G>Нужно еще чтобы он реагировал на объявления классов, структур и typedef'оф — при это заполнял себе табличку символов


еще и #define умел расручивать
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Обработка cpp файла
От: _Winnie Россия C++.freerun
Дата: 11.10.05 13:03
Оценка: +5
Здравствуйте, Аноним, Вы писали:
А>которая зарагружает сpp файл и определяет скока в ней была объявлена переменых.
Имей в виду, что это задание невозможно выполнить самостоятельно, если не использовать какой-нибудь уже сущесвующий front-end(по которому месяц придется читать документацию) . С++ слишком сложный язык.

Самый тривиальный пример —

int (*x)(); — это объявление переменной.
int *(x)(); — а это — нет.

Даже отличить комментарий от некоментария в С++ — уже сложнейшая задача. А тут поймать такую тонкость как "объявление переменной"...
Скажи преподавателю, что задание в такой формулировке — некорректно. Пусть он попробует дать внятное определение, что такое "объявление переменной", не требующее всей 20-ти страничной противоречивой грамматики С++.

Так что имей ввиду, что при такой формулировке преподаватель всегда найдет к чему придраться.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Обработка cpp файла
От: gear nuke  
Дата: 11.10.05 13:50
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Люди учусь я на программиста и задали мне написать программу,

А>которая зарагружает сpp файл и определяет скока в ней была объявлена переменых.
А>Помоготи плз в написаний этой программы а то в голову нечего нормально не приходит.

Можно посмотреть исходники lcc, A Retargetable Compiler for ANSI C. Он довольно прост и специально создавался в качестве учебного пособия по написанию компиляторов (авторы выпустили книгу). Нужно препроцессор, лексер и синтаксический анализатор.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Обработка cpp файла
От: gear nuke  
Дата: 11.10.05 13:52
Оценка:
Ещё Tiny C Compiler.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Обработка cpp файла
От: jazzer Россия Skype: enerjazzer
Дата: 11.10.05 15:29
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, jazzer, Вы писали:


J>>Ну что, бери грамматику языка, как она описана в Стандарте, и вперед, пиши синтаксический анализатор.

J>>По-хорошему, тебе нужно, чтобы он все корректно парсил (ничего при этом не делая), а реагировал только на объявления переменных (что тебе и нужно) и типов (чтобы корректно распознавать объявления этих переменных).

G>Нужно еще чтобы он реагировал на объявления классов, структур и typedef'оф — при это заполнял себе табличку символов :)


А разве это не подходит под объявление типов?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Обработка cpp файла
От: Аноним  
Дата: 12.10.05 01:26
Оценка:
НЕ люди вы меня не поняли проверять надо тока стондартные типы (int,char,const и т.д)!!!
Re[4]: Обработка cpp файла
От: gear nuke  
Дата: 12.10.05 01:48
Оценка:
Здравствуйте, jazzer, Вы писали:

G>>Нужно еще чтобы он реагировал на объявления классов, структур и typedef'оф — при это заполнял себе табличку символов


J>А разве это не подходит под объявление типов?


Подходит, но внутри этих типов могут быть и объявления int . ИМХО без полноценного разбора не обойтись.

Хотя бы на уровне doxygen нужно анализировать. Мда, только что подумал — а не проще ли распарсить выход после dixygen ? .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Обработка cpp файла
От: gear nuke  
Дата: 12.10.05 02:12
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>НЕ люди вы меня не поняли проверять надо тока стондартные типы (int,char,const и т.д)!!!


А-а-а, Вам нужно готовое решение?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Обработка cpp файла
От: gear nuke  
Дата: 12.10.05 02:17
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>int (*x)(); — это объявление переменной.

_W>int *(x)(); — а это — нет.

_W>Даже отличить комментарий от некоментария в С++ — уже сложнейшая задача.


С комментариями, как раз, всё очень просто — их вырезают на стадии препроцессора. Однострочные — просто пропускаем всё до аналогов \n. Многострочные — до первого */. А код выше требует синтаксического разбора.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Обработка cpp файла
От: Аноним  
Дата: 12.10.05 05:37
Оценка: -1
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, _Winnie, Вы писали:


_W>>int (*x)(); — это объявление переменной.

_W>>int *(x)(); — а это — нет.

_W>>Даже отличить комментарий от некоментария в С++ — уже сложнейшая задача.


GN>С комментариями, как раз, всё очень просто — их вырезают на стадии препроцессора. Однострочные — просто пропускаем всё до аналогов \n. Многострочные — до первого */. А код выше требует синтаксического разбора.


Да неужели? Покажи мастер-класс, о гуру.

З.Ы. Блажен кто верует
Re[4]: Обработка cpp файла
От: gear nuke  
Дата: 12.10.05 06:22
Оценка: +1
Здравствуйте, <Аноним>,

GN>>С комментариями, как раз, всё очень просто — их вырезают на стадии препроцессора. Однострочные — просто пропускаем всё до аналогов \n. Многострочные — до первого */. А код выше требует синтаксического разбора.


А>Да неужели? Покажи мастер-класс, о гуру.


Отрицательно отношусь к анонимному хамству. Не по Вашей просьбе, а ради того что бы не сложилось мнение, что я не отвечаю за слова, фрагмент препроцессора (код не кросплатформенный):
    while( true )
    {
        static const unsigned short cr_lf = '\r\n';
        unsigned two_chars = *(unsigned short *) src;
        ++src;
        switch( two_chars )
        {
        // new line
        case cr_lf:     ++src;
        end_of_line:    // Выход только здесь
            line->length = (unsigned)dest - (unsigned)line;
            if( line->length > sizeof(Line) )
                return line;
            dest = (Byte *) line;
            return 0;

        // single line comment  //
        case '//':
            // Пропускаем все символы до конца строки.
            while( true )
            {
                two_chars = *(unsigned short *) src;
                ++src;
                if( two_chars == cr_lf )   
                {   
                    ++src;
                    goto end_of_line;
                }
                if( (unsigned char) two_chars == '\n' || '\r' == (unsigned char) two_chars )
                    goto end_of_line;
            }// never get here

        // multiline comment    /*
        case '*/':      ++src;
            // Пропускаем все символы до конца комментария.
            while( true )
            {
                two_chars = *(unsigned short *) src;
                ++src;
                if( two_chars == cr_lf )
                {
                    ++src,  ++line_number; 
                    continue;
                }
                if( (unsigned char) two_chars == '\n' || '\r' == (unsigned char) two_chars )
                {
                    ++line_number; 
                    continue;
                }
                if( two_chars == '/*' )     //  */
                {
                    ++src;  
                    goto whitespace;
                }
            }// never get here

        // Односимвольные.
        default:
            if( (unsigned char) two_chars == '\n' || '\r' == (unsigned char) two_chars )
                goto end_of_line;

            if( (unsigned char) two_chars <= ' ' )
            {
        whitespace:
            //  Пробелы нужно сохранять, только что бы различить 2 варианта:
            //  #define foo()
            //  #define foo ()
                if( *src == '(' )
                    *dest++ = ' ';
                continue;           // основной цикл
            }



А>З.Ы. Блажен кто верует
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Обработка cpp файла
От: Кодёнок  
Дата: 12.10.05 06:27
Оценка: +1
Здравствуйте, gear nuke, Вы писали:

GN>>>С комментариями, как раз, всё очень просто — их вырезают на стадии препроцессора. Однострочные — просто пропускаем всё до аналогов \n. Многострочные — до первого */. А код выше требует синтаксического разбора.


А>>Да неужели? Покажи мастер-класс, о гуру.


GN>Отрицательно отношусь к анонимному хамству. Не по Вашей просьбе, а ради того что бы не сложилось мнение, что я не отвечаю за слова, фрагмент препроцессора (код не кросплатформенный):


Твой код неверно разберёт такой комментарий:
/\
* @@@@@@@@@@@ */
Re[6]: Обработка cpp файла
От: gear nuke  
Дата: 12.10.05 06:39
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Твой код неверно разберёт такой комментарий:

Кё>
Кё>/\
Кё>* @@@@@@@@@@@ */

Там и другие ошибки есть
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Обработка cpp файла
От: jazzer Россия Skype: enerjazzer
Дата: 12.10.05 07:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>НЕ люди вы меня не поняли проверять надо тока стондартные типы (int,char,const и т.д)!!! :???:


комментарии тебе все равно придется выдирать ведь, и всякие хитрые объявления сложных типов, в которых первым словом стоит int, типа
int (*)(int())


Так что так просто не отвертишься :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.