Для текущей грамматики, которую я анализирую с помощью X3, пробелы и комментарии в стиле Perl игнорируются.
Мне кажется, что в X3 парсер пропуска — это просто обычный парсер, и любой ввод, который он потребляет, считается «пропущенным». Я придумал это:
namespace x3 = boost::spirit::x3;
auto const blank_comment =
x3::blank | x3::lexeme[ '#' >> *(x3::char_ - x3::eol) >> x3::eol ];
При анализе очень простого ввода (пара строк комментариев и одна строка строк в кавычках) это, кажется, работает хорошо. (Жить на Колиру)
Однако, поскольку я не могу найти какую-либо документацию по этому вопросу, а детали текущих пропускающих анализаторов скрыты в сложной системе шаблонов, я надеялся получить некоторую информацию.
Я ранее искал SO для деталей, и нашел ответ, используя Qi (Custom Skip Parser с Boost :: Spirit). Поскольку я никогда не изучал ци, многие детали трудно понять. Метод, который я описал выше, кажется более интуитивным.
Да, это нормально.
Шкипер кажется довольно оптимальным. Вы могли бы оптимизировать 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"`
Других решений пока нет …