Почему парсер Qi останавливается до окончания текста?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему парсер Qi останавливается до окончания текста?

Сообщение Anonymous »

Я пишу анализатор Qi, чтобы проанализировать выражения, подобные тем, что ниже: < /p>
(! $ 23 && $ 45) || ! $ 67 < /p>
И, возможно, более общий, как < /p>

Код: Выделить всё

!($1 && $2 && $3) || (!$4 && $5) && $6)
< /code>
К сожалению, я использую VisualStudio 2010 с старой версией Boost 1.67, так что нет STD C ++ 11 доступен < /p>
Я начинаю с простого до правильного анализа, таких как $ (т. Е. Например, $ 89) и определение грамматической системы. Правила, с которыми я в конечном итоге, были эти: < /p>
stepid  = long_[ref(longv) = _1, _val = _1];
stepref = (lit("$") >> stepid)[phx::bind(&evaluate_step, &longv, &boolv), _val = ref(boolv) ];
< /code>
, где Longv и Boolv являются двумя атрибутами грамматики (Long и Bool), а оценка_теп является простой глобальной функцией с этой подписью < /p>
void evaluate_step(const long* s, bool* b)
< /code>
Далее я определил правило для определения фактора < /p>
factor  = stepref[_val = _1] | "!" >> stepref[_val = !_1];
< /code>
Эти три правила могут разрабатывать без ошибок, такие как 45 долларов и!term    = factor[_val = _1] | (factor[_val = _1] >> "&&" >> factor)[_val = _val && _1];
< /code>
, чтобы разобрать строки, такие как "$ 2 &&! 3 $". Я пытаюсь проанализировать «$ 32 && $ 33». Ниже вы можете найти весь грамматический код и как он используется. < /P>
template
struct composite : qi::grammar
{
composite() : composite::base_type(start)
{
using qi::lit;
using qi::_val;
using qi::_1;
using qi::_2;
using qi::_3;
using qi::_4;
using qi::long_;
using ascii::char_;
using phx::ref;
using phx::val;

stepid  = long_[ref(longv) = _1, _val = _1];
stepref = (lit("$") >> stepid)[phx::bind(&evaluate_step, &longv, &boolv), _val = ref(boolv) ];

term    = factor[_val = _1]                                  |
(factor[_val = _1] >> "&&" >> factor)[_val = _val && _1];

factor  = stepref[_val = _1]                 |
"!" >> stepref[_val = !_1];

start = term[_val = _1];
}

qi::rule stepid;
qi::rule stepref;
qi::rule term;
qi::rule factor;

qi::rule start;

long longv;
bool boolv;

};

int _tmain(int argc, _TCHAR* argv[])
{

using boost::spirit::ascii::space;
std::string expr = "$32 && $33";

composite c;

bool result = false;
std::string::iterator iter = expr.begin();
std::string::iterator end  = expr.end();
bool r = phrase_parse(iter, end, c, space, result);

std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79663402/why-qi-parser-stops-before-text-end[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Событие окончания HTML-видео не работает с объявлением времени начала и окончания в элементе
    Гость » » в форуме Jquery
    0 Ответы
    77 Просмотры
    Последнее сообщение Гость
  • Искусственный интеллект документов, парсер счетов, как тренироваться на коде
    Гость » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Гость
  • Java-парсер викитекста [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Использовать простой парсер HTML DOM для JSON?
    Anonymous » » в форуме Php
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Парсер видео на Facebook
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»