4

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

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

有什么建议吗?

编辑

最简单的解决方案是:

任何 [\x00-\xff]

并使用“任何”而不是“。” 在我的规则中。

4

2 回答 2

7

我自己一直在研究这个并阅读 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 字符,但仍然相当难看。

希望这可以帮助!

于 2009-05-28T16:03:54.103 回答
1

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

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

于 2009-06-30T13:34:15.643 回答