Lex / Yaccを使用して漢字の識別子を認識するにはどうすればよいですか?
2 に答える
Lex(レクサージェネレーター)のことだと思います。yacc はパーサージェネレーターです。
Unicode の漢字の完全な範囲は何ですか?によると、、ほとんどの CJH 文字がこの3400-9FFF
範囲に含まれます。
http://dinosaur.compilertools.net/lex/index.htmlによると
任意の文字。ほぼすべての文字に一致するには、演算子文字 . 改行を除くすべての文字のクラスです。移植性はありませんが、8 進数へのエスケープは可能です。
[\40-\176]
8 進数 40 (空白) から 8 進数 176 (チルダ) までの ASCII 文字セットのすべての印刷可能な文字に一致します。
したがって、必要なものはのようなものだと思い[\32000-\117777]
ます。
Yacc
は漢字を気にしませんが、気にlex
します: 入力バイト (および文字) を分析してトークンを認識する責任があります。ただし、漢字は一般にマルチバイトです。これをサポートするような プログラムがありますlex
が、そうではありませんlex
。それは何度か議論されてきました。
参考文献:
標準の語彙トークナイザー
lex
(またはflex
) は、マルチバイト文字を受け入れないため、多くの現代言語では実用的ではありません。このドキュメントでは、UTF-8 マルチバイト文字を記述する正規表現からシングルバイトの正規表現へのマッピングについて説明します。
Unicode の Flex(lexer) サポート(2012/3/8)
回答は、UTF-8 パターンの特殊なケースを使用して制限を回避する方法を指摘しています。
Flex での Unicode サポート(2009/4/26)
基本的に前と同じ (ただし、前の、およびそれらのコメントの可能なソース)
CでUnicode文字をlexするにはどうすればよいですか?
回答には、ここで尋ねられたことを行う可能性のあるいくつかの代替実装がリストされています。