【问题标题】:Can Bison parse UTF-8 characters?Bison 可以解析 UTF-8 字符吗?
【发布时间】:2009-06-01 14:46:33
【问题描述】:

我正在尝试制作一个 Bison 解析器来处理 UTF-8 字符。我不希望解析器实际解释 Unicode 字符值,但我希望它将 UTF-8 字符串解析为字节序列。

现在,Bison 生成了以下有问题的代码:

  if (yychar <= YYEOF)
    {
      yychar = yytoken = YYEOF;
      YYDPRINTF ((stderr, "Now at end of input.\n"));
    }

问题是 UTF-8 字符串的很多字节都会有负值,Bison 将负值解释为 EOF,然后停止。

有没有办法解决这个问题?

【问题讨论】:

    标签: c++ utf-8 bison


    【解决方案1】:

    bison 是,flex 不是。有一次我需要一个野牛解析器来处理 UTF-8 编码的文件,我最终编写了自己的 yylex 函数。

    edit:为了提供帮助,我使用了glib 中可用的大量 Unicode 操作(有一个 gunicode 类型和一些我发现有用的文件/字符串操作函数)。

    【讨论】:

    • 好吧,我的词法分析器可以很好地处理 UTF-8 字符,但是 Bison 解析器一看到负值就会停止解析。请指教。
    • 您是否一次读取 1 个字节的文件?还是一次 1 个 utf-8 编码字符?
    • 那就是问题所在。表示 'char' 在 ASCII 中为负的位与告诉 UTF-8 char 长度超过 1 个字节 (IIRC) 的位相同。你需要使用 fgetc 以外的东西。
    【解决方案2】:

    flex 是这里的问题,您可能想看看zlex

    【讨论】:

    • 这是一个有趣的项目,但不能完全解决这个问题中解决的问题。 16 位字符与 UTF-8 编码字符不同(一方面,UTF-8 的长度最多为 4 个字节)。
    【解决方案3】:

    这是 4 年前的一个问题,但我也面临同样的问题,我想分享我的想法。

    问题在于,在 UTF-8 中,您不知道要读取多少字节。如上所述,您可以使用自己的词法分析器,让它读取整行,或者每次读取 4 个字节。然后从中提取 UTF-8 字符,并读取更多字节以再次完成到 4 个字节。

    【讨论】:

    • 虽然在实际读取每个字符之前您可能不知道要读取多少字节,但您可能不需要知道。要正确标记字节流,您真正需要知道的是哪些字节模式作为关键字、分隔符等很重要。词法分析器不需要解释其他任何内容;它只是将字节序列收集到令牌中。即使您想向调用者报告字符文字标记,也可以编写匹配有效 UTF-8 代码序列的词法模式规则,并使用这些规则正确扫描传入的多字节字符。
    猜你喜欢
    • 2014-04-16
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2017-01-09
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多