Russian Qt Forum
Ноябрь 23, 2024, 08:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Игнорирование комментариев при парсинге.  (Прочитано 22780 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #15 : Апрель 21, 2014, 12:51 »

Что значит не принципиально? Улыбающийся
Комментарии всегда начинаются с определённой последовательности и заканчиваются определённой последовательностью. Обязательно. Улыбающийся

Т.е. я имел в виду, что комменты могут начинаться и заканчиваться и с более чем одного символа) 
(Не правильно выразился))
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Апрель 21, 2014, 12:59 »

В этих примерах комментарий начинается от // и #, а заканчивается eol (концом строки).
Так eol не фиксирован, все 3 варианта (\n, \r, \n\r) актуальны. И возникает неприятный эффект: "сожрав" eol для комментариев теряем индекс текущей строки. И старая проблема вложенности никуда не делась, напр
Цитировать
"start quote
void foo(); // "
end quote"

Код
C++ (Qt)
template <class T = char>
class tex_string_iterator : public std::iterator<std::bidirectional_iterator_tag, T, ptrdiff_t, const T*, const T&>
 

Ну как всегда: "вынос мозга" я получаю сразу же, а вот до удобства юзания далековато Улыбающийся Мельком глянул BibText, вроде все норм, мой велик прокатит. Ставлю {}, получаю "первый левель", затем парсю содержимое по иерархии. Как у Вас это сделать - не знаю.

Но хотелось бы и другие соображения/подходы пообсуждать.
Как насчет отслеживания (номера) текущей строки? Это необходимо хотя бы для выдачи ошибки
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #17 : Апрель 21, 2014, 13:07 »

Так eol не фиксирован, все 3 варианта (\n, \r, \n\r) актуальны.
Ну и что? Как это отменяет завершение одно строчных комментариев?

И возникает неприятный эффект: "сожрав" eol для комментариев теряем индекс текущей строки.
Так "сжирайте" его с умом, что бы таких детских проблем не было.

И старая проблема вложенности никуда не делась, напр
Еще одна выдуманная проблема?
Здесь нужно пропускать все от start quote до end quote, вообще все.
Но номера строк продолжать считать, ну если делать с умом.

Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #18 : Апрель 21, 2014, 13:15 »

Цитировать
Ну как всегда: "вынос мозга" я получаю сразу же, а вот до удобства юзания далековато..
Напротив, это удобно: я пользуюсь всё теми же регулярками и токенайзерами.. Единственное что изменилось - в boost::regex, boost::tokenizer теперь используют не string::const_iterator, а пользовательский tex_string_iterator
Код
C++ (Qt)
boost::regex expr("([#\\\\][^\\n]*)");
 
   std::string buffer = "Te#st\nyy\\yy ";
 
   tex_string_iterator<char> iter(buffer.begin(), buffer.end(), expr);
   tex_string_iterator<char> end(buffer.end(), buffer.end(), expr);
 
   for (; iter != end; ++iter) {
       std::cout << *iter;
   }
 
Вывод:
Код
Bash
Teyy
 
Цитировать
Как насчет отслеживания (номера) текущей строки? Это необходимо хотя бы для выдачи ошибки
Никаких проблем не вижу.. Зная позицию пользовательского итератора, я всегда могу сказать на какой строчке он находится.. поскольку этот итератор указывает на позицию в исходной строке..
Комментарии никуда не деваются: пользовательский итератор их просто пропускает (если встречает при декрементировании/инкрементировании)
  
« Последнее редактирование: Апрель 21, 2014, 13:17 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Апрель 21, 2014, 13:34 »

Никаких проблем не вижу.. Зная позицию пользовательского итератора, я всегда могу сказать на какой строчке он находится.. поскольку этот итератор указывает на позицию в исходной строке..
Я так понял "исходная строка" - это весь текст (ну или его часть, но неск строк), поэтому получить из позиции номер строки не так уж просто. А читая строку за строкой теряем "контекст" (напр след строка должна знать что коммент открыт)

Здесь нужно пропускать все от start quote до end quote, вообще все.
Надо-то надо, но каким образом?

Но номера строк продолжать считать, ну если делать с умом.
Ах, оказывается надо делать, да еще и "с умом"! А я-то думал что с таким мощным инструментарием делать придется минимум  Плачущий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #20 : Апрель 21, 2014, 13:41 »

Надо-то надо, но каким образом?
Считайте номера строк не в пользовательском коде, а в самом вашем анализаторе.
Указатель прошел eol -> инкремент номера.
Вот в мощном инструментарии это можно сделать в итераторе.

А я-то думал что с таким мощным инструментарием делать придется минимум  Плачущий
Я бы не назвал ваш анализатор мощным инструментарием: у него детские ситуации вызывают огромные проблемы. Улыбающийся
А в мощных инструментариях все есть из коробки: и номер строки, и номер столбца, а при необходимости можно написать даже свое поведение.
« Последнее редактирование: Апрель 21, 2014, 15:02 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Апрель 21, 2014, 15:57 »

Я бы не назвал ваш анализатор мощным инструментарием: у него детские ситуации вызывают огромные проблемы. Улыбающийся
Не стоит считать себя "взрослым" - Вы еще очень юны  Улыбающийся

А в мощных инструментариях все есть из коробки: и номер строки, и номер столбца, а при необходимости можно написать даже свое поведение.
Та может быть, но такого пока не вижу. Зато уже длинная сопля темплейтов и какая-то вариация regexp, в который тоже придется вникать Плачущий Отмазки ТС не кажутся мне убедительными
Сейчас, к сожалению, моя задача не сводится к банальному разбиванию текста на токены..
Чего это она "не сводится"? По-моему прекрасно сводится. Если я не в курсе каких-то нюансов BibText - поясните на примере.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #22 : Апрель 21, 2014, 16:06 »

Не стоит считать себя "взрослым" - Вы еще очень юны  Улыбающийся
Нет проблем, я вам уже говорил, сороковник это не возраст для мужчины. Улыбающийся

Та может быть, но такого пока не вижу.
Ну и что?
Здесь не школа, что бы каждую мелочь разжевывать. Улыбающийся

Зато уже длинная сопля темплейтов и какая-то вариация regexp, в который тоже придется вникать Плачущий
Еще раз, ну и что?
Проблемы индейцев шерифа не волнуют. Не вникайте.

Отмазки ТС не кажутся мне убедительными
Всем наплевать. Улыбающийся

Мы обсуждаем конкретный вопрос, никому ненужно вас в чем-то переубеждать или уговаривать разбираться.
Так же не интересно заново обсуждать проблемы вашего анализатора, для этого уже есть тема.
« Последнее редактирование: Апрель 21, 2014, 16:40 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Апрель 21, 2014, 18:51 »

Всем наплевать. Улыбающийся
Вы уже неск раз прибегаете к этой формуле которая звучит поразительно глупо Улыбающийся Вас никто не уполномачивал выражать мнение "всех" Улыбающийся И если мне плевать - то я просто не стану тратить на это слова и время. Чего попусту "хлопать крыльями"?  Улыбающийся

Мы обсуждаем конкретный вопрос, никому ненужно вас в чем-то переубеждать или уговаривать разбираться.Так же не интересно заново обсуждать проблемы вашего анализатора, для этого уже есть тема.
m_ax предложил обсудить др подходы - вот я и обсуждаю. И мне лично неясно чем же простецкая разбивка на токены плоха в данном случае. Да, в своем парсере я действовал именно так - но ведь просто потому что я так думаю, это совсем не значит что я навязываю свое решение.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #24 : Апрель 21, 2014, 18:58 »

вот я и обсуждаю.
Так а где вы обсуждаете? Улыбающийся
Я пока увидел, только детские расстройства: так длинно, там не понятно, а этого я вообще не вижу.

Если бы вам это было нужно, вы бы думали и разбирались (вся нужная для этого информация в теме уже есть), а так вы просто капризничаете. Улыбающийся

Вы уже неск раз прибегаете к этой формуле которая звучит поразительно глупо Улыбающийся
Это единственный способ прекратить ваши повествования о себе. Улыбающийся
« Последнее редактирование: Апрель 21, 2014, 19:04 от Old » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #25 : Апрель 21, 2014, 22:24 »

Igors, давайте пока абстрагируемся от конкретных реализаций.. Шаблоны-не шаблоны - это сейчас не так важно..
Важен сам концепт. У меня такое ощущение, что мы о разных вещах говорим(

Объясню ещё раз, почему для меня тема с комментами здесь актуальна.. На очень простом примере.

Вначале была задача:
Имеется текст. В тексте встречаются выражения такого вида \command{ arg1, arg2, arg3, ... argN}, где  \command - это некоторая команда, arg1, ... argN - список её аргументов. Число аргументов не фиксировано.
Нужно извлечь из текста список всех аргументов (без повторений, в порядке их появления в тексте).

Эта задача решается просто. Один из вариантов решения - это вначале пройтись регуляркой и выцепить содержимое того что содержится в фигурных скобках. Затем уже, например, токенайзером, вытащить список всех аргументов..
И здесь вроде бы всё хорошо работает.. Вот возможный код такого решения:
Код
C++ (Qt)
   boost::sregex_iterator it(buffer.begin(), buffer.end(), boost::regex("\\\\cite[\\s\\t]*\\{([^}]*)\\}"));
   boost::sregex_iterator end;
   for (; it != end; ++it) {
       std::string str(it->str(1));
       boost::tokenizer<boost::char_separator<char>> tok(str, boost::char_separator<char>(","));
       for (auto it = tok.begin(); it != tok.end(); ++it) {
           std::string arg = boost::algorithm::trim_copy(*it);
           if (std::find_if(args_list.begin(), args_list.end(), std::bind(std::equal_to<std::string>(), _1, arg)) == args_list.end())
                 args_list.push_back(arg);
       }
   }
 
(здесь команда называется \cite)

А теперь слегка усложним задачу.. Сейчас наш формат допускает наличие комментариев. Комментарий начинается с символа % и заканчивается концом строки.
Теперь, если какая то команда окажется в закоментированном блоке, то предыдущее решение по прежнему выцепит её..  Более того, коменты могут быть и внутри команды, что ещё попортит нам крови при разбиении на токены..

Так вот я и спрашиваю: как лучше поступить? Мой вариант такой: написать свой итератор, который просто "перепрыгивает через коменты".. Тогда концептуально в самом разборе ничего не измениться. Нужно только поменять string::const_iterator на пользовательский tex_string_iterator. Всё.
Вот как это может выглядеть:
Код
C++ (Qt)
   tex_string_iterator<char> ibegin(buffer.begin(), buffer.end(), boost::regex("(%[^\\n]*)"));
   tex_string_iterator<char> iend(buffer.end(), buffer.end(), boost::regex("(%[^\\n]*)"));
 
   boost::regex_iterator<tex_string_iterator<char>> it(ibegin, iend, boost::regex("\\\\cite[\\s\\t]*\\{([^}]*)\\}"));
   boost::regex_iterator<tex_string_iterator<char>> end;
   for (; it != end; ++it) {
       std::string str(it->str(1));
       boost::tokenizer<boost::char_separator<char>> tok(str, boost::char_separator<char>(","));
       for (auto it = tok.begin(); it != tok.end(); ++it) {
           std::string arg = boost::algorithm::trim_copy(*it);
           if (std::find_if(args_list.begin(), args_list.end(), std::bind(std::equal_to<std::string>(), _1, arg)) == args_list.end())
               args_list.push_back(arg);
       }
   }
 

Другой возможный вариант, который обсуждался здесь - это просто удалить из текста перед парсингом все коменты..

И наконец - это Spirit::Qi 

Вот Вы, Igors какой концепт предлагаете?   
 
     


 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #26 : Апрель 22, 2014, 04:47 »

m_ax, смотрите на что наткнулся: https://bitbucket.org/sergiu/bibtex-spirit
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #27 : Апрель 22, 2014, 06:18 »

Вот Вы, Igors какой концепт предлагаете?
Иш ты, концепт-монцепт.
Мы тут строки сосчитать не можем, а он туда же.
И слово такое обобщенно задроченное подобрал "концепт".
А потом этими руками хлеб берешь.

Подмигивающий Веселый
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #28 : Апрель 22, 2014, 07:39 »

m_ax, смотрите на что наткнулся: https://bitbucket.org/sergiu/bibtex-spirit


Круто) Спасибо за ссылку)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #29 : Апрель 22, 2014, 07:40 »

Вот Вы, Igors какой концепт предлагаете?
Иш ты, концепт-монцепт.
Мы тут строки сосчитать не можем, а он туда же.
И слово такое обобщенно задроченное подобрал "концепт".
А потом этими руками хлеб берешь.

Подмигивающий Веселый

Не виноватаяя.. Он сам пришёл  Смеющийся
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.187 секунд. Запросов: 23.