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

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

Страниц: 1 2 3 [4] 5 6 7   Вниз
  Печать  
Автор Тема: Разбор QString  (Прочитано 62920 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #45 : Май 06, 2013, 10:40 »

Ещё раз: Здесь у вас квадратные и круглые скобки имеют одинаковый приоритет, т.е. фактически, они равноправны. Почему вы делаете выбор в пользу круглых скобок, а не квадратных? Ведь первая цитата начинается именно с них (с квадратных).
Ничего я не делаю. Мой разбор должен работать так  
[test(],test)]  // первый вернул все в квадратных скобках (включая их)
test + (],test)   // второй вернул 2 токена
] + , + test  // третий

Что не так?

Цитировать
Непонятно как Вы обойдетесь без приоритета здесь
test("some)thing")

Или даже здесь (не вижу как у Вас это отрабатывается)
test("something()")
Да легко, в зависимости от того, что мне нужно будет получить.
Предъявляем результаты Вашего парсера  Улыбающийся

Ещё раз:
..
Да легко,
Меньше зазнайства = лучше  Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #46 : Май 06, 2013, 11:42 »

Ещё раз: Здесь у вас квадратные и круглые скобки имеют одинаковый приоритет, т.е. фактически, они равноправны. Почему вы делаете выбор в пользу круглых скобок, а не квадратных? Ведь первая цитата начинается именно с них (с квадратных).
Ничего я не делаю. Мой разбор должен работать так  
[test(],test)]  // первый вернул все в квадратных скобках (включая их)
test + (],test)   // второй вернул 2 токена
] + , + test  // третий

Что не так?

Похоже, у нас с вами немного разные представления о том, что такое quote и о том, как она должна интерпретироваться.
Для меня quote - это то, что заключено между первым открывающим цитату (bra символом) и закрывающим её (ket символом). Причём баланс bra и ket символов должен быть одинаков. При этом любой другой bra символ не имеет права экранировать ket символ принадлежащий другой паре (bra, ket ).
Например такая ситуация:
Код
C++ (Qt)
   std::string std_src = "author = {Singh, A. and S\"urgers, C. },\n year = \"2013\"\n ";
   parse_param param(",=", " \t\n");
   param.add_quote('{', '}');
   param.add_quote('"','"');
 
   string_parser parser(param);
   size_t pos = 0;
   while ((pos = parser.next_token(std_src, pos, split_behavior::keep_empty_parts)) != std::string::npos) {
       std::cout << parser.result() << std::endl << parser.token() << std::endl;
       pos += parser.matched_length();
    }
 
Даст вполне ожидаемый результат:
Код
Bash
author
=
{Singh, A. and S"urgers, C. }
,
year
=
"
2013"


В то время, как ваш вариант (с равными приоритетами) распарсит это совсем по другому (что противоречит здравому смыслу)
Код
C++ (Qt)
   QString src = "author = {Singh, A. and S\"urgers, C. },\n year = \"2013\"\n ";
   CParseParam cparam(" \t\n", ",=");
   cparam.AddQuote(10, "{", "}");
   cparam.AddQuote(10, "\"", "\"");
 
   QStringRef temp;
   QStringParser cparser(src, cparam);
    while(cparser.NextToken(temp)) {
       qDebug() << temp;
   }
 
Вывод будет таким:
Код
Bash
"author"
"="
"{Singh, A. and S"urgers, C. },
year = "2013"
"

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

Цитировать
Предъявляем результаты Вашего парсера  
Опять-таки, в зависимости от интерпретации формата. Там какая то каша (в первом варианте) + не понятно что нужно извлечь.. Неоднозначность, о которой я уже писал и которую поощрять, подобными приоритетами, может быть чревато..
« Последнее редактирование: Май 06, 2013, 12:00 от m_ax » Записан

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

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

Сообщений: 2095



Просмотр профиля
« Ответ #47 : Май 06, 2013, 12:35 »

Я понимаю зачем вам нужны эти приоритеты.. Я к тому, что нужно определить правила игры так, чтоб это было очевидно и не приводило к неоднозначным ситуациям..
Записан

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #48 : Май 06, 2013, 12:41 »

Похоже, у нас с вами немного разные представления о том, что такое quote и о том, как она должна интерпретироваться.
Для меня quote - это то, что заключено между первым открывающим цитату (bra символом) и закрывающим её (ket символом). Причём баланс bra и ket символов должен быть одинаков. При этом любой другой bra символ не имеет права экранировать ket символ принадлежащий другой паре (bra, ket ).
По жизни: все что в кавычках (строка, литерал) должно рассматриваться как 1 токен - железно, независимо от того что там слева и справа от кавычек. Что значит "не имеет права"? Типа "работаем только с корректными данными, пусть, мол, юзверь обеспечит баланс и тогда..". Это несерьезно  Улыбающийся

Опять от жизни/практики: вложенная кавычка (я за это получал по ушам в том же json)

QString src("Weapon \\\"test\\\");
Weapon \"test\"   // в читабельном виде

А Вы отпихнулись одним символом начала и конца (bra + ket).

Еще реальный пример - разрушен баланс тех же скобок. Чего это Вы так весело выдаете npos - это ж нет больше данных? А они есть - и об ошибке надо сообщать (а не сачковать)

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

Сообщений: 2095



Просмотр профиля
« Ответ #49 : Май 13, 2013, 16:26 »

Да, и ещё об определениях, что есть токены и что есть делимы:

token - one piece of information, a "word"
delimiter - one (or more) characters used to separate tokens

 
Записан

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

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

Сообщений: 2095



Просмотр профиля
« Ответ #50 : Июль 03, 2013, 17:49 »

Кстати, решение предложенное в boost::tokinizer http://www.boost.org/doc/libs/1_54_0/libs/tokenizer/ (точнее, как он архитектурно устроен) гораздо более гибкое и расширяемое, чем реализации предложенных здесь велосипедов.

Например, для разбивки на токены:
Код
C++ (Qt)
std::string str = "text1, text2: text3, text4";
boost::tokenizer<boost::char_separator<char>> tok(str, boost::char_separator<char>(",:"));
for (auto it = tok.begin(); it != tok.end(); ++it)
   std::cout << *it << std::endl;
 
где boost::char_separator - это класс, реализующий алгоритм разбиения строки, где  разделители dropped_delims являются простыми символами (char, как в примере).  

Также в boost::tokenizer входят такие алгоритмы как:
escaped_list_separator  http://www.boost.org/doc/libs/1_54_0/libs/tokenizer/escaped_list_separator.htm
и
offset_separator http://www.boost.org/doc/libs/1_54_0/libs/tokenizer/offset_separator.htm

К сожалению ни один из них не реализует полную поддержку работы с цитатами (escaped_list_separator - предоставляет только частный случай), как обсуждалось здесь выше.
Однако, архитектурное решение boost::tokenizer очень гибкое и позволяет реализовать пользовательский алгоритм разбиения строки на токены.
При этом интерфейс  tokenizerа и работа с ним останется неизменными.

И так для реализации своего алгоритма нужно написать свой класс, где должны быть определены два метода (смотрим исходники boost token_functions.hpp):

Код
C++ (Qt)
enum class empty_token_policy { drop_empty_tokens, keep_empty_tokens };
 
template <class CharT>
class simple_char_separator
{
public:
   typedef std::basic_string<CharT> string_type;
   typedef typename string_type::const_iterator const_iterator;
 
   void reset() {}
 
    bool operator()(const_iterator & next, const_iterator end, string_type & tok) const {
 
   }
 
};
 
Фактически, сам алгоритм реализуется в   bool operator()(const_iterator & next, const_iterator end, string_type & tok). Здесь end указывает на конец строки, а next - текущий итератор. Этот метод вызывается при каждой итерации, результат записывается в tok и итератор next также продвигается к следующей позиции. Итерации продолжаются до тех пор, пока метод возвращает true.
Вобщем, всё просто)

Ниже привожу пример своей реализации, поддерживающей цитаты. Пример использования:
Код
C++ (Qt)
#include <iostream>
#include "core/spec_token_functions.h"
#include <boost/tokenizer.hpp>
 
int main()
{
   std::string str = "text1, {text2, text3.} : text4. \"text5, abs\" ";
 
   bibmake::core::quote_list<char> quotes('{', '}');
   quotes.add_quote('"', '"');
 
   std::string dropped_delims = ",.";
   std::string kept_delims = ":";
 
   typedef bibmake::core::spec_char_separator<char> spec_char_separator;
   boost::tokenizer<spec_char_separator> tok(str, spec_char_separator(dropped_delims, kept_delims, quotes));
   for (auto s : tok) {
       std::cout << s << std::endl;
   }
 
   return 0;
}
 
где вывод будет такой:
Код
Bash
text1
{text2, text3.}
:
text4
"text5, abs"
 

Реализация spec_token_functions приатачена)




 




  
Записан

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

Arch Linux Plasma 5
Bepec
Гость
« Ответ #51 : Июль 03, 2013, 17:53 »

Не в обиду вас, m_ax будет сказано, но после прочтение второй строчки code у меня появилось стойкое ощущение что я читаю что-то явно неправильное Веселый

А такое ощущение у меня обычно появляется когда разбираю библиотеку "нарисовать линию", в которой имеется функционал построение звезды смерти в 3D.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #52 : Июль 03, 2013, 18:06 »

Не в обиду вас, m_ax будет сказано, но после прочтение второй строчки code у меня появилось стойкое ощущение что я читаю что-то явно неправильное Веселый

А такое ощущение у меня обычно появляется когда разбираю библиотеку "нарисовать линию", в которой имеется функционал построение звезды смерти в 3D.

А что именно не понятно? У меня, когда я первое время смотрел boost, тоже складывалось стойкое ощущение.. хм..)
Но со временем привыкаю) Всё же в решения в booste очень грамотно спроектированы) Не в обиду igors'у  Подмигивающий  
Записан

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #53 : Июль 03, 2013, 19:52 »

Кстати, решение предложенное в boost::tokinizer http://www.boost.org/doc/libs/1_54_0/libs/tokenizer/ (точнее, как он архитектурно устроен) гораздо более гибкое и расширяемое, чем реализации предложенных здесь велосипедов.
Можно сказать проще
Цитировать
ЛЮБОЕ рещение в бусте ЛУЧШЕ, гибче и.т.п. ЛЮБОГО своего решения
С этим трудно спорить - напр мой парсер годится только для QString, а дустовский наверняка для любого строчника - уже лучше. Но может быть Вас еще смущает что звучит это утверждение как-то "не очень хорошо" - ведь так может сказать и просто лох, из простых соображений типа "буст - солидная, авторитетная либа, а ты хто такой?"  Улыбающийся

В действительности не все так просто. Наверняка Вы замечали что далеко не все форумчане горят желанием юзать буст. Ах, глупые, ленивые, "не хотят учиться" и.т.п. Глупости. Реальные причины другие

- порог вхождения длстаточно высок. На освоение бустовского решения Вы затратили не меньше времени чем на написание своего

- было бы хорошо если просто "раз выучил - навсегда пользуйся". Однако так происходит не всегда.  Напр для поддержки цитат Вам пришлось написать кусок кода вполне соразмеримый с "велосипедом"

- самое главное, и самое страшное: дальнейшая ПОДДЕРЖКА этого кода. Возможно то что Вы написали - гораздо лучше, грамотнее и.т.п. (впрочем необязательно). Но поверьте, в проекте это PITA (pain in the ass). Потому что для хоть каких-то дальнейших изменений будет печальный выбор:
   - нанимать бойца владеющего дустом (который будет воротить морду и требовать высоких гонораров)
   - переключить имеющихся работников на фиксацию (связанную с изучением всех этих вумностей)
И то и другое обойдется недешево. С др стороны - так ли уж необходим столь изощренно-обобщенный код? На примере той же задачи (разбор скобок/цитат) я Вам точно скажу - нет. Это скромная утилитарная задача, и платить за нее заказчик хочет адекватно. Привлекая "слишком мощные средства" мы только создаем проблемы.

Ну и вообще - это становится глупой самоцелью. Возникает иллюзия что все что угодно можно "освоить" усилиями памяти - но не ума. Ах да, "все уже давно написано". Но это справедливо только для довольно узкого круга простых и/или известных задач. К сожалению "емкость мозга" ограничена - чем больше он набрался всякой всячины - тем более он беспомощен когда приходится думать/решать самому. Увы, по-видимому это неизбежно  Плачущий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #54 : Июль 03, 2013, 19:56 »

чем больше он набрался всякой всячины - тем более он беспомощен когда приходится думать/решать самому.
Это не правда. Все в точности наоборот. Улыбающийся

- порог вхождения длстаточно высок. На освоение бустовского решения Вы затратили не меньше времени чем на написание своего
Тоже не правда. Любой программист C++ (внимание не С с классами), а грамотный программист, спокойно пользуется большинством бустовских библиотек. Именно поэтому она так популярна. То, что она не очень популярна на форуме Qt и так понятно, в Qt есть много своих аналогичных решений.

- самое главное, и самое страшное: дальнейшая ПОДДЕРЖКА этого кода. Возможно то что Вы написали - гораздо лучше, грамотнее и.т.п. (впрочем необязательно). Но поверьте, в проекте это PITA (pain in the ass). Потому что для хоть каких-то дальнейших изменений будет печальный выбор:
   - нанимать бойца владеющего дустом (который будет воротить морду и требовать высоких гонораров)
   - переключить имеющихся работников на фиксацию (связанную с изучением всех этих вумностей)
Это чудо аргумент.  Смеющийся
Вас не смущает, что если нужно написать GUI, то нужно нанимать бойца умеющего Qt/wxWidget/GTK/..., который будет воротить морду и требовать высокий гонорар? Или переключать имеющегося сотрудника на фиксацию связанную с GUI? Тогда почему вас смущает боец с boost? В чем для вас разница между Qt и boost (ну кроме того, что с первой вы справились, а со второй нет)? Улыбающийся

Вас эти решения не устраивают только по одной причине - вы не смогли/захотели освоить boost, а теперь хотите красиво за это оправдаться. Только зачем?
« Последнее редактирование: Июль 03, 2013, 22:38 от Old » Записан
Bepec
Гость
« Ответ #55 : Июль 03, 2013, 20:04 »

Я лично отношусь к обществу описанному Igors.

Мне трудно с бустом. К примеру те же самые рег экспы я не смог освоить в бусте за полчаса. Скачав библиотечку в виде 1 (одного)  файла я разобрался с ней за 3 минуты. И без документации Веселый
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #56 : Июль 03, 2013, 20:08 »

Мне трудно с бустом. К примеру те же самые рег экспы я не смог освоить в бусте за полчаса. Скачав библиотечку в виде 1 (одного)  файла я разобрался с ней за 3 минуты. И без документации Веселый
Попросите на работе проект без Qt, попробуйте все сделать на голом C++, уверяю вас, что по завершению проекта вы будете тут его восхвалять, так же как Qt. Подмигивающий

А уж скиллы как свои поднимите.... Улыбающийся
Записан
Bepec
Гость
« Ответ #57 : Июль 03, 2013, 20:12 »

Спасибо, я саботировать работу не собираюсь ^.^
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #58 : Июль 03, 2013, 20:14 »

Спасибо, я саботировать работу не собираюсь ^.^
В принципе да, для чего что-то еще, если есть Qt.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #59 : Июль 03, 2013, 21:26 »

К сожалению "емкость мозга" ограничена - чем больше он набрался всякой всячины - тем более он беспомощен когда приходится думать/решать самому. Увы, по-видимому это неизбежно  Плачущий
Категорически с этим не согласен. Процесс осваивания и изучения чего то нового, как раз и развивает мышление, заставляет сопостовлять, находить, устанавливать связи и т.д.
Напротив, когда человек изолирован в решение своей задачи, очень может быть, что он просто окажется в тупике, бъясь лбом об стену.    
« Последнее редактирование: Июль 03, 2013, 21:29 от m_ax » Записан

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

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


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