Анализ CSV с контекстно-свободной грамматикой - PullRequest
1 голос
/ 25 декабря 2011

Я бы хотел проанализировать CSV, используя контекстно-свободную грамматику. У меня уже есть реализация на C ++, но я хочу масштабировать CFG до более сложных проблем, но сначала мне нужно решить простую.

Итак, вот что у меня есть (мой синтаксис похож на повышение духа):

CSV состоит из одной или нескольких строк

Start >> +Line

Строка состоит из символов, разделенных запятыми, плюс EOL

Line >> Symbol >> *(',' Symbol) >> EOL

Разделитель EOL может быть в стиле Windows или Unix.

EOL >> -'\r' >> '\n'

Вот где я застрял при обработке строк в кавычках:

Symbol >> 
    string |
????

Пример сложных строк в кавычках, которые должны быть правильно проанализированы:

"This, is a ""complex"" example of a CSV string!"

"This, is a more """"""complex"""""" but theoretically possible example of a CSV string!"

Я новичок в CFG и не могу понять, как охарактеризовать это в CFG. Как правило, вам нужно игнорировать запятые и двойные двойные кавычки, когда государство входит в режим кавычек.

UPDATE: Я только что понял, что мне нужно добавить больше состояний в мой концептуальный конечный автомат, исходя из понимания моей теории автоматов, что CFG может быть распознан с помощью автоматов:

Symbol --> 
    string
    " doublequotemode "
    ' singlequotemode '

doublequotemode -->
    *"" string *""

Вопрос в том, как это работает с бустом и жадным / не жадным разбором?

1 Ответ

0 голосов
/ 06 января 2012

Это будет обрабатывать (двойные) строки в кавычках, заменяя "" одинарной кавычкой " внутри строки в кавычках:

  noquote = char_ - '"';
  quoted_string = lexeme[lit('"') >> *(noquote | '"' >> char_('"')) >> '"'];
...