【问题标题】:How to make a flex (lexical scanner) to read UTF-8 characters input?如何制作 flex(词法扫描仪)来读取 UTF-8 字符输入?
【发布时间】:2010-10-29 15:06:53
【问题描述】:

flex 似乎不支持 UTF-8 输入。每当扫描器遇到非 ASCII 字符时,它就会停止扫描,就好像它是一个 EOF。

有没有办法强制 flex 吃掉我的 UTF-8 字符?我不希望它真正匹配 UTF-8 字符,只是在使用 '.' 时吃掉它们。模式。

有什么建议吗?

编辑

最简单的解决方案是:

任何 [\x00-\xff]

并使用 'ANY' 而不是 '.'在我的规则中。

【问题讨论】:

  • 如果它有效,那就太好了 :) 适当的 unicode 支持会很好。
  • 同意。我现在正在处理一个不同的问题,Flex 检查“if(yychar
  • 你会遇到很多问题。从内部看,重写 ecs 代码、表格生成器和其他东西将是一项任务。从头开始可能会更好:P 需要帮助吗?
  • 啊。这太可怕了。我在 flex 邮件列表上发布了一个问题,我们将看看这些人要说什么。
  • 只是我的 2 美分:使用 ANY [\x00-\xff] 代替 . (点)是一个糟糕的主意:1)不安全,它接受无效的 UTF-8(溢出,非 Unicode 平面),2)它只匹配一个字节而不是 UTF-8 多字节,3)你需要启用 8 -bit,并非所有 lex/flex 工具都支持。要匹配一个有效的 UTF-8 字符,您需要 [\x00-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xec][\x80-\xbf][\x80-\xbf]|\xed[\x80-\x9f][\x80-\xbf]|[\xee\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf3][\x80-\xbf][\x80-\xbf][\x80-\xbf]|\xf4[\x80-\x8f][\x80-\xbf][\x80-\xbf]

标签: utf-8 lexical-analysis flex-lexer


【解决方案1】:

编写一个否定字符类也可能会有所帮助:

[\n \t] 返回空白; [^\n \t] 重新运行 NON_WHITESPACE

【讨论】:

    【解决方案2】:

    我自己一直在研究这个问题,并阅读了 Flex 邮件列表,看看是否有人考虑过。让 Flex 读取 unicode 是一件复杂的事情......

    可以进行UTF-8编码,而大多数其他编码(16s)将导致驱动自动机的大量表格。

    目前常用的方法是:

    我所做的只是编写匹配单个 UTF-8 的模式 人物。它们看起来像 以下,但您可能想要 重新阅读 UTF-8 规范 因为这是我很久以前写的。
    你当然需要结合 这些,因为你想要 unicode 字符串, 不仅仅是单个字符。

    UB [\200-\277] %% 
    [\300-\337]{UB}                   { do something } 
    [\340-\357]{UB}{2}                { do something } 
    [\360-\367]{UB}{3}                { do something } 
    [\370-\373]{UB}{4}                { do something } 
    [\374-\375]{UB}{5}                { do something }
    

    取自邮件列表。

    在进一步研究之后,我可能会考虑为 UTF-8 支持创建适当的补丁。对于大型 .l 文件,上述解决方案似乎无法维护。而且真的很丑!您可以使用类似于创建“。”的范围。替换规则以匹配所有 ASCII 和 UTF-8 字符,但仍然相当难看。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-06-20
      • 1970-01-01
      • 2012-11-02
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      • 2022-01-07
      相关资源
      最近更新 更多