2

á、é、í、ó、ú、ñなどのアクセント付き文字を含むすべての単語を入力ファイルから抽出するには、JFlex を使用してパーサーを作成する必要があります。

私の問題は、すべてのファイルを UTF8 エンコーディングと %unicode タグで設定しても、それらの文字を認識できないことです。

.lex ファイルは次のようになります。

import java_cup.runtime.*;
%%
%class ParserLex
%unicode
%public
%final
%cup

%init{
%init}

%{
    private Symbol sym(int type) {
        return sym(type, yytext());
    }
    private Symbol sym(int type, Object value) {
        return new Symbol(type, yyline, yycolumn, value);
    }
%}

Token       = [áéíóú]
ANY         = .

%%

{Token}
    { System.out.println(yytext()); }

{ANY}
    {   }

そして、私のテストクラスは次のようなものです:

class ParserTest {
    public static void main(String[] args) throws IOException {
        InputStreamReader reader = new InputStreamReader(new FileInputStream(args[0]), "UTF8");
        ParserLex parser = new ParserLex(reader);
        for (Symbol sym = parser.next_token(); sym.sym != 0; sym = parser.next_token()) {
        }
        reader.close();
    }
}

この問題に関するアイデアやアドバイスはありますか?

4

1 に答える 1

0

私は最近、jFlexが次のようなエラーを出力することを発見しました

Warning in file "scanner.jflex" (line 42):
Rule can never be matched:
"???"  { return new Symbol(Symbols.CIRCLED_MINUS, 1, yycolumn + 1, null); }

UTF-8 文字リテラルの場合

"⊖"  { return new Symbol(Symbols.CIRCLED_MINUS, 1, yycolumn + 1, null); }

Linux を使用しているため、LANG環境変数を変更してエンコーディング (例: ) を指定するC.UTF-8と、警告が削除されました。コマンド ライン オプションを使用する-Dfile.encoding=UTF-8と、より移植性が高くなります。また、jFlex がシステムのデフォルト エンコーディングを尊重していることを示唆するfeature request 29も見つけました。

于 2013-07-01T07:35:27.360 に答える