Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
1

Spirit::qi - не обновляются данные в грамматике

05.03.2015, 13:16. Просмотров 694. Ответов 2
Метки нет (Все метки)

Есть такой код простой грамматики, которая парсит данные в std::map<std::string, int>. При добавлении того же самого ключа в мапу значение не обновляется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <utility>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
 
namespace qi = boost::spirit::qi;
 
using map_t = std::map<std::string, int>;
using pair_t = std::pair<std::string, int>;
 
//grammar:
/*
 * val1 = 42;
 * val2 = 84;
 * val2 = 0;
*/
template <typename Iterator>
struct my_grammar : qi::grammar<Iterator, map_t(), qi::space_type>
{
   my_grammar() : my_grammar::base_type(pairs)
   {
      pairs = pair % pair >> ';';
      pair  = key >> '=' >> value;
      key   = (qi::alpha | qi::char_('_')) >> *(qi::alnum | qi::char_('_'));
      value = qi::int_;
   }
 
   qi::rule<Iterator, map_t(), qi::space_type> pairs;
   qi::rule<Iterator, pair_t(), qi::space_type> pair;
   qi::rule<Iterator, std::string()> key;
   qi::rule<Iterator, int()> value;
};
 
int main()
{
   std::string expr;
   map_t map;
 
   while (true)
   {
      std::cout << "Enter expr: ";
      std::getline(std::cin, expr);
      std::string::iterator  begin = expr.begin(), end   = expr.end();
      my_grammar<std::string::iterator> gr;
      qi::phrase_parse(begin, end, gr, qi::space, map);
 
      for (const auto& p : map)
         std::cout << p.first << " " << p.second << "\n";
   }
}
Пример ввода:
Enter expr: a = 42;
a 42
Enter expr: b = 84;
a 42
b 84
Enter expr: c = 0;
a 42
b 84
c 0
Enter expr: a = 0;
a 42 <-- значение не изменилось
b 84
c 0
В чем может быть проблема и как исправить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2015, 13:16
Ответы с готовыми решениями:

Не обновляются/добавляются данные данные через клиент
привет форумчане,не обновляются данные через клиент при нажатии на кнопку ничего не происходит...

Не обновляются данные
К проекту прикреплена ms access. Есть две формочки. Форма1: Авторизация пользователей -...

Не обновляются данные в БД
Не получается обновить данные , ничего не происходит! ( &lt;? /* Соединяемся с базой данных...

Не обновляются данные в бд
public void UpdateUser(User user) { OleDbCommand cmd = new OleDbCommand();...

Не обновляются данные
$obnov = mysql_query(&quot;UPDATE zakazi SET (ime=&quot;$ime&quot;, data_zakaza=&quot;$data_zakaza&quot;, firma=&quot;$firma&quot;,...

2
ForEveR
В астрале
Эксперт С++
8003 / 4761 / 653
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
06.03.2015, 11:20 2
DiffEreD, Нужно смотреть сорцы, чтобы понять как значения присваиваются. В spirit довольно сложный код...
0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.03.2015, 01:24  [ТС] 3
Короче, решил так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <string>
#include <map>
#include <utility>
 
#include <boost/phoenix/phoenix.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
 
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
 
using map_t = std::map<std::string, int>;
using pair_t = std::pair<std::string, int>;
 
struct insert_impl
{
   template <typename T>
   struct result
   {
      typedef void type;
   };
 
   template <typename Container, typename Arg>
   void operator() (Container & container, const Arg & p) const
   {
      container[p.first] = p.second;
   }
};
 
phx::function<insert_impl> const insert = insert_impl();
 
//grammar:
/*
 * Value : int
 * Key : string
 * Pair : Key = Value
 * Pairs : Pair ;
*/
template <typename Iterator>
struct my_grammar : qi::grammar<Iterator, map_t(), qi::space_type>
{
   my_grammar() : my_grammar::base_type(pairs)
   {
      pairs = pair[insert(phx::ref(qi::_val), qi::_1)] >> ';';
      pair  = key >> '=' >> value;
      key   = (qi::alpha | qi::char_('_')) >> *(qi::alnum | qi::char_('_'));
      value = qi::int_;
   }
 
   qi::rule<Iterator, map_t(), qi::space_type> pairs;
   qi::rule<Iterator, pair_t(), qi::space_type> pair;
   qi::rule<Iterator, std::string()> key;
   qi::rule<Iterator, int()> value;
};
 
int main()
{
   std::string expr;
   map_t map;
 
   while (true)
   {
      std::cout << "Enter expr: ";
      std::getline(std::cin, expr);
      std::string::iterator  begin = expr.begin(), end   = expr.end();
      my_grammar<std::string::iterator> gr;
      qi::phrase_parse(begin, end, gr, qi::space, map);
 
      for (const auto& p : map)
         std::cout << p.first << " " << p.second << "\n";
   }
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2015, 01:24

Не обновляются данные в бд
Есть код php: $text = sanitizeString($_POST); //колдовство с $text...

Не обновляются данные
Нужно для товара автоматически сгенерировать артикул, состоящий из буквы &quot;а&quot;, ID категории и ID...

Не обновляются данные в БД
&lt;? include (&quot;block/bd.php&quot;); $result = mysql_query(&quot;SELECT nimi,puh FROM contact ORDER BY id...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru