Boost Spirit X3 Пропустить реализацию парсера?

Для текущей грамматики, которую я анализирую с помощью X3, пробелы и комментарии в стиле Perl игнорируются.

Мне кажется, что в X3 парсер пропуска — это просто обычный парсер, и любой ввод, который он потребляет, считается «пропущенным». Я придумал это:

namespace x3 = boost::spirit::x3;
auto const blank_comment =
x3::blank | x3::lexeme[ '#' >> *(x3::char_ - x3::eol) >> x3::eol ];

При анализе очень простого ввода (пара строк комментариев и одна строка строк в кавычках) это, кажется, работает хорошо. (Жить на Колиру)

Однако, поскольку я не могу найти какую-либо документацию по этому вопросу, а детали текущих пропускающих анализаторов скрыты в сложной системе шаблонов, я надеялся получить некоторую информацию.

  1. Это правильный способ определения «пропустить парсер»? Есть ли стандартный метод?
  2. Существуют ли проблемы производительности с такой реализацией? Как бы это было улучшено?

Я ранее искал SO для деталей, и нашел ответ, используя Qi (Custom Skip Parser с Boost :: Spirit). Поскольку я никогда не изучал ци, многие детали трудно понять. Метод, который я описал выше, кажется более интуитивным.

1

Решение

Да, это нормально.

Шкипер кажется довольно оптимальным. Вы могли бы оптимизировать quoted_string править путем изменения порядка и использования отрицания набора символов (operator~):

Жить на Колиру

#include <boost/spirit/home/x3.hpp>

namespace parser {
namespace x3 = boost::spirit::x3;
auto const quoted_string = x3::lexeme [ '"' >>  *('\\' >> x3::char_ | ~x3::char_("\"\n")) >> '"' ];
auto const space_comment = x3::space | x3::lexeme[ '#' >> *(x3::char_ - x3::eol) >> x3::eol];
}

#include <iostream>
int main() {
std::string result, s1 = "# foo\n\n#bar\n   \t\"This is a simple string, containing \\\"escaped quotes\\\"\"";

phrase_parse(s1.begin(), s1.end(), parser::quoted_string, parser::space_comment, result);

std::cout << "Original: `" << s1 << "`\nResult: `" << result << "`\n";
}

Печать

Original: `# foo

#bar
"This is a simple string, containing \"escaped quotes\""`
Result: `This is a simple string, containing "escaped quotes"`
2

Другие решения

Других решений пока нет …