如何使用 Lex/Yacc 识别汉字中的标识符?
2 回答
我认为您的意思是 Lex(词法分析器生成器)。Yacc 是解析器生成器。
根据Unicode中汉字的完整范围是多少?, 大多数 CJH 字符都在该3400-9FFF
范围内。
根据http://dinosaur.compilertools.net/lex/index.html
任意性格。要匹配几乎任何字符,操作符字符 . 是除换行符以外的所有字符的类。尽管不可移植,但转义为八进制是可能的:
[\40-\176]
匹配 ASCII 字符集中的所有可打印字符,从八进制 40(空白)到八进制 176(波浪号)。
所以我会假设你需要的是类似[\32000-\117777]
.
Yacc
不关心汉字,但lex
有:它负责分析输入字节(和字符)以识别令牌。但是,汉字一般都是多字节的。有类似 lex
的程序可能支持这一点,但它们不是lex
. 已经讨论过好几次了。
进一步阅读:
标准的词法标记器
lex
(或flex
)不接受多字节字符,因此对于许多现代语言来说是不切实际的。本文档描述了从描述 UTF-8 多字节字符的正则表达式到单字节正则表达式的映射。
Flex(lexer) 支持 unicode (2012/3/8)
答案指出了如何通过使用 UTF-8 模式的特殊情况来解决限制。
Flex 中的 Unicode 支持(2009/4/26)
与之前的基本相同(但在前面,并且可能是这些评论的来源)
-
答案列出了一些替代实现,这些实现可能在这里被问到。