Для моего express проекта парсера я хотел бы использовать CSV, например, с экранированием: ""
для экранирования "
Примеры:
"\"hello\"",
" \" hello \" ",
" \" hello \"\"stranger\"\" \" ",
онлайн-компиляция и попытка: https://wandbox.org/permlink/5uchQM8guIN1k7aR
мое текущее правило синтаксического анализа анализирует только первые 2 теста
qi::rule<std::string::const_iterator, qi::blank_type, utree()> double_quoted_string
= '"' >> qi::no_skip[+~qi::char_('"')] >> '"';
Я нашел этот вопрос переполнения стека и один ответ дан с использованием духа:
Как я могу читать и анализировать CSV-файлы в C ++?
start = field % ',';
field = escaped | non_escaped;
escaped = lexeme['"' >> *( char_ -(char_('"') | ',') | COMMA | DDQUOTE) >> '"'];
non_escaped = lexeme[ *( char_ -(char_('"') | ',') ) ];
DDQUOTE = lit("\"\"") [_val = '"'];
COMMA = lit(",") [_val = ','];
(я не знаю, как связать ответы, поэтому, если интересует поиск "Вы должны гордиться, когда Вы используете что-то такое прекрасное, как boost :: spirit ")
к сожалению, это не компилируется для меня - и даже годы анализа сообщений об ошибках C ++ не подготовили меня к наводнениям об ошибке Spirit :) и, если я понимаю, Правильно, правило будет ожидать ,
в качестве разделителя строк, что может быть неправильно для моего проекта парсера выражений
expression = "strlen( \"hello \"\"you\"\" \" )+1";
expression = "\"hello \"";
expression = "strlen(concat(\"hello\",\"you\")+3";
, или же правило необязательно ждать ,
и )
в этом случае?
надеюсь, я не задам слишком много глупых вопросов но ответы на эти вопросы очень помогают мне проникнуть в дух, сам синтаксический анализ выражений почти работает, за исключением экранирования строки
thx для любой помощи
ОБНОВЛЕНИЕ: это похоже на работу мне, по крайней мере, он анализирует строки, но удаляет экранированный "
из строки, есть ли лучший выход отладки для строк? " " " " "h" "e" "l" "l" "o" " " "s" "t" "r" "a" "n" "g" "e" "r" " "
не очень хорошо читается
qi::rule<std::string::const_iterator, utree()> double_quoted_string
= qi::lexeme['"' >> *(qi::char_ - (qi::char_('"')) | qi::lit("\"\"")) >> '"'];