如何制作flex(词法扫描仪)来读取UTF-8字符输入?

如何制作flex(词法扫描仪)来读取UTF-8字符输入?,utf-8,lexical-analysis,flex-lexer,Utf 8,Lexical Analysis,Flex Lexer,似乎不支持UTF-8输入。每当扫描仪遇到非ASCII字符时,它就会停止扫描,就像它是EOF一样 有没有办法强迫flex吃掉我的UTF-8字符?我不想让它真正匹配UTF-8字符,只要在使用“.”模式时吃掉它们即可 有什么建议吗 编辑 最简单的解决方案是: 任何[\x00-\xff] 在我的规则中使用“ANY”而不是“.”。我自己也在研究这个问题,并阅读Flex邮件列表,看看是否有人考虑过它。让Flex读取unicode是一件复杂的事情 UTF-8编码是可以完成的,大多数其他编码(16s)将导致大量

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

有没有办法强迫flex吃掉我的UTF-8字符?我不想让它真正匹配UTF-8字符,只要在使用“.”模式时吃掉它们即可

有什么建议吗

编辑

最简单的解决方案是:

任何[\x00-\xff]


在我的规则中使用“ANY”而不是“.”。

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

UTF-8编码是可以完成的,大多数其他编码(16s)将导致大量表驱动自动机

目前常用的方法是:

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

摘自邮件列表

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


希望这有帮助

编写NegateTCharacterClass也可能有帮助:

[\n\t]返回空白;
[^\n\t]retrun NON_WHITESPACE

如果可以的话,很好:)适当的unicode支持会很好。我现在遇到了另一个问题,Flex检查“如果(yychar你会有很多问题。看看内部,重写ecs代码、表生成器和其他东西将是一项任务。最好从头开始:P想要帮助吗?啊。这太糟糕了。我在flex邮件列表上发布了一个问题,我们看看这些家伙有什么要说的。只需我的2美分:使用
ANY[\x00-\xff]
代替(点)是一个糟糕的想法:1)不安全,它接受无效的UTF-8(溢出,非Unicode平面),2)它只匹配一个字节而不是UTF-8多字节,3)您需要启用8位,这不是所有lex/flex工具都支持的。要匹配一个有效的UTF-8字符,您需要
[\x00-\x7f].[\xc2-\xdf][\x80-\xbf].\xe0-\xbf]\X0-\X0 0-\xbf\\\X0\\\X0\\\X0 0\\X0 0\X0 0 0\X0 0 0-\X0 0 0\\\X0 0 0 0 0\\\X0 0-\X0 0\\\X0\\\X0\\\X0\\\\X0 0\\\\\X0 0\\\\\\X0 0 0 0 0 0 0 0 0\\\\\X0 0 0 0 0 0 0 0 0 0\\\\\\X0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\\\\\\\\\X0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\\\\\\\\\\\\\X7 7 7 7 7[[[[[[[[[[[[[[[[[[[[[[[[0\\\\\\\\\x80-\xbf]
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 }