Я пишу парсер Qi для разбора IRC-сообщений, переписывая RFC 2812. Среди грамматика совершенно mundate альтернатива:Boost.Spirit.Qi alternative (|) parser issue
auto const hostname = shortname >> *('.' >> shortname);
auto const nickUserHost = nickname >> -(-('!' >> user) >> '@' >> host);
auto const prefix = hostname | nickUserHost;
Я сбит с толку, чтобы видеть, что моя тестовая строка ("[email protected]"
) соответствует nickUserHost
, но не prefix
.
Единственная замечательная вещь, которую я вижу в том, что nickUserHost
«s host
сами определяются в терминах hostname
, но я не знаю, как это будет влиять на разбор в любом случае.
Это нарочно, потому что я ожидаю, что это соответствует весь вход. Это на самом деле влияет на поведение '|'? – Quentin
@Quentin no, но 'hostname' преуспевает, не потребляя весь вход (и, соответственно,' nickUserHost' никогда не пробовали), а затем 'eoi' заставляет ваш синтаксический анализ терпеть неудачу. Вам нужно поместить 'eoi' в каждую ветвь' | '. – llonesmiz
Erm. Я просто пропустил, что вы не используете Spirit X3. ** 'auto' не подходит для выражений парсера' ** См. https://stackoverflow.com/questions/26410498/undefined-behaviour-somewhere-in-boostspiritqiphrase-parse/26411266#26411266 – sehe