似乎flex不支持 UTF-8 输入。每当扫描仪遇到非 ASCII 字符时,它就会停止扫描,就像它是 EOF 一样。
有没有办法强制 flex 吃掉我的 UTF-8 字符?我不希望它真正匹配 UTF-8 字符,只是在使用 '.' 时吃掉它们。图案。
有什么建议吗?
编辑
最简单的解决方案是:
任何 [\x00-\xff]
并使用“任何”而不是“。” 在我的规则中。
似乎flex不支持 UTF-8 输入。每当扫描仪遇到非 ASCII 字符时,它就会停止扫描,就像它是 EOF 一样。
有没有办法强制 flex 吃掉我的 UTF-8 字符?我不希望它真正匹配 UTF-8 字符,只是在使用 '.' 时吃掉它们。图案。
有什么建议吗?
编辑
最简单的解决方案是:
任何 [\x00-\xff]
并使用“任何”而不是“。” 在我的规则中。
我自己一直在研究这个并阅读 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 字符,但仍然相当难看。
希望这可以帮助!
编写一个否定字符类也可能有帮助:
[\n \t] 返回空白;[^\n \t] 重新运行 NON_WHITESPACE