如何使flex(词法扫描器)读取UTF-8字符输入?

时间:2009-05-28 15:54:05

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

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

有没有办法强迫我吃掉我的UTF-8字符?我不希望它实际上匹配UTF-8字符,只是在使用'。'时吃掉它们。图案。

有什么建议吗?

修改

最简单的解决方案是:

任何[\ x00- \ xff]

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

2 个答案:

答案 0 :(得分:6)

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

希望这有帮助!

答案 1 :(得分:1)

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

[\ n \ t]返回WHITESPACE; [^ \ n \ t]重新启动NON_WHITESPACE