【问题标题】:CSV parsing with a context free grammar使用上下文无关语法进行 CSV 解析
【发布时间】:2011-12-25 13:19:10
【问题描述】:

我想使用上下文无关语法解析 CSV。我已经用 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 和贪婪/非贪婪解析一起工作?

【问题讨论】:

    标签: boost csv boost-spirit context-free-grammar


    【解决方案1】:

    这将处理(双)引号字符串替换 "" 与单引号 " 在引号字符串中:

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

    【讨论】:

      猜你喜欢
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      相关资源
      最近更新 更多