Boost 使用上下文无关语法进行CSV解析

Boost 使用上下文无关语法进行CSV解析,boost,csv,boost-spirit,context-free-grammar,Boost,Csv,Boost Spirit,Context Free Grammar,我想使用上下文无关语法解析CSV。我的ARTIY在C++中有一个实现,但是我想缩放CFG到更难的问题,但是首先我需要解决一个简单的问题。 下面是我到目前为止所做的(我的语法类似于boost-spirit): CSV由一行或多行组成 Start >> +Line 行由逗号分隔的符号加上EOL组成 Line >> Symbol >> *(',' Symbol) >> EOL EOL分隔符可以是windows或unix样式 EOL >>

我想使用上下文无关语法解析CSV。我的ARTIY在C++中有一个实现,但是我想缩放CFG到更难的问题,但是首先我需要解决一个简单的问题。 下面是我到目前为止所做的(我的语法类似于boost-spirit):

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中描述这一点。基本上,当状态进入引号模式时,您需要忽略逗号和双引号

更新: 我刚刚意识到,我需要向概念上的有限状态机添加更多的状态,这是因为我的自动机理论中的一个观点,即CFG可以被下推自动机识别:

Symbol --> 
    string
    " doublequotemode "
    ' singlequotemode '

doublequotemode -->
    *"" string *""
问题是如何处理boost和贪婪/非贪婪解析?

这将处理(双引号)字符串,用引号内的单引号替换
”:

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