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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться почему неработет парсер Spiri 
:(
    Опции темы
Elfet
  Дата 13.1.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Приветствую!

Пожалуйста помогите разобраться почему не работает парсер Boost::Spirit (Classic)

Хочу отпарсить вот такой вот файл:
Цитата
(0 1223123)
(2 3231233)
(31 укукукучик)
.....


Пытаюсь обработать таким вот парсером:
Код

 if(parse(buffer,
                 // Parser Start

                 *( '(' >> 

                 int_p[push_back_a(blocks)] >> 

                 ~ch_p('x')  // Вот тут точно не знаю что должно стоять. Мне нужно принять всё что может быть. Даже возможно такую конструкцию: (0 tes(tr io 12 32))

                 >> ')' )

                 ,space_p

                 // Parser End
                 ).hit)


Но почему то выдаёт только номер первого блока.  smile 


Вот весь код примера:
Код

#include <QtCore/QCoreApplication>

#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

#include <boost/spirit/include/classic_core.hpp>
using namespace boost::spirit::classic;


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    ifstream ifs;
    ifs.open("_g.txt", std::ios::in);

    if(ifs.is_open())
    {
        char * buffer;
        int length;

        //узнаем размер файла, и выделяем память в строке
        ifs.seekg( 0, std::ios_base::end );
        length = ifs.tellg();
        ifs.seekg( 0, std::ios_base::beg );

        // выделяем память:
        buffer = new char [length];

        // читаем как блок:
        ifs.read(buffer,length);
        ifs.close();

        vector<int> blocks;

        if(parse(buffer,
                 // Parser Start

                 *( '(' >> int_p[push_back_a(blocks)] >> ~ch_p('x') >> ')' )

                 ,space_p

                 // Parser End
                 ).hit)
        {

            for(unsigned i = 0; i < blocks.size(); i++)
            {
                stringstream oss;
                oss << i;

                cout << "block: " << oss.str() << endl;
            }
        }
        else
        {
            cout << "Parse Error..." << endl;
        }

        delete[] buffer;
    }
    else
    {
        cout << "Open Error..." << endl;
    }

     cout << "All Done!" << endl;

    return a.exec();
}



Заранее спасибо! 


--------------------
PM MAIL WWW Skype   Вверх
bsa
Дата 13.1.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Попробуй так:
Код
if( parse(buffer,
           *( ch_p('(') >> int_p[push_back_a(blocks)] >> lexeme_d[+anychar_p >> ')']),
           space_p
          ).hit)

PM   Вверх
Elfet
Дата 14.1.2010, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



bsa, всё равно находит только первый блок :(



--------------------
PM MAIL WWW Skype   Вверх
bsa
Дата 14.1.2010, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



А если так?
Код
if( parse(buffer,
           lexeme_d[*( ch_p('(') >> *space_p >> int_p[push_back_a(blocks)] >> +space_p >> +anychar_p >> ')')],
           space_p
          ).hit)

PM   Вверх
Elfet
Дата 14.1.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Мне удалось разобрать немного при помощи вот такой вот конструкции:
Код

MyGrammar inner;

        if(parse(buffer,
                 // Parser Start

                 *( ch_p('(') >> int_p[push_back_a(blocks)] >> +inner >> ')' ) ,

                 space_p

                 // Parser End
                 ).hit)

Где MyGrammar:
Код

class MyGrammar : public grammar<MyGrammar> {
public:

    template<typename ScannerT> class definition {
    public:

        definition( const MyGrammar & self ) {

            word = +int_p;

            wordGroup = word | '(' >> *( word | wordGroup ) >> ')' ;
        }

        rule<ScannerT> const & start() const {
            return wordGroup;
        }

    private:
        rule<ScannerT> wordGroup, word;
    };
};


Но странно то что если пробую писать так, то ничего не выходит:
Код

rule<> intlist, rounded;

        intlist = +int_p;
        rounded = intlist | '(' >> *( intlist | rounded ) >> ')' ;

        if(parse(buffer,
                 // Parser Start

                 *( ch_p('(') >> int_p[push_back_a(blocks)] >> +rounded >> ')' ) ,

                 space_p

                 // Parser End
                 ).hit)


 smile 

Можно ли как-нибудь записать то что обработала грамматика MyGrammar?  Типа этого:  int_p[push_back_a(blocks)]  ?


--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 14.1.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



smile 

И ещё странность: если заменить +int_p на block_body 
где rule<> block_body =  +int_p; тоже перестаёт работать. 

 smile 

Мне как-то нужно собрать всё вот это:
Цитата

(INT   что то ещё, включая цифры, знаки, пробелы, переносы строк, скобки "(", ")")
(INT   ...)
(INT   ...)
(INT   ...)
....


 smile

Добавлено через 3 минуты и 39 секунд
Ещё вопрос: а как можно поместить в строку всё что собрал +anychar_p[assign_a(str)] ?


--------------------
PM MAIL WWW Skype   Вверх
kosmonaFFFt
Дата 17.1.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нужен именно spirit?
Может стоит посмотреть в сторону flex+byacc или flex+bison?


--------------------
user posted image
PM MAIL ICQ   Вверх
Elfet
Дата 17.1.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



kosmonaFFFt, ага, хотелось бы на бусте. В бусте ещё есть QI и Karama. Но я не нашёл документации по ним :(


--------------------
PM MAIL WWW Skype   Вверх
zim22
Дата 17.1.2010, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Elfet @  17.1.2010,  16:14 Найти цитируемый пост)
 В бусте ещё есть QI и Karama. Но я не нашёл документации по ним :(

http://www.boost.org/doc/libs/1_36_0/libs/..._and_karma.html
***
волшебные слова для гугла "boost karma qi"

Это сообщение отредактировал(а) zim22 - 17.1.2010, 18:46


--------------------
PM MAIL   Вверх
Elfet
Дата 17.1.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



А на русском ничего гугл не выдаёт :(


--------------------
PM MAIL WWW Skype   Вверх
zim22
Дата 17.1.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Elfet @  17.1.2010,  19:54 Найти цитируемый пост)
А на русском ничего гугл не выдаёт :(

ну уж извините. без английского никуда.


--------------------
PM MAIL   Вверх
Elfet
Дата 18.1.2010, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



zim22, ясно. Буду переводить smile


--------------------
PM MAIL WWW Skype   Вверх
chaos
Дата 18.1.2010, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Elfet, по подробнее бы рассказали бы про файл исходный
PM WWW   Вверх
chaos
Дата 18.1.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



я бы написал нечто подобное(не проверял, тк негде)
Код

element = '(' >> uint_ >> space >> +char_ >> ')';
paresr = element >> *(eol >> element);


далее добавил бы действия по добавлению "key-value" в map
PM WWW   Вверх
bsa
Дата 18.1.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



chaos, пока не вышел C++0x (в частности, тип auto), твой вариант не очень рабочий...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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