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