【问题标题】:JFlex and accented charactersJFlex 和重音字符
【发布时间】:2013-05-15 17:18:06
【问题描述】:

我需要使用 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();
    }
}

关于这个问题有什么想法或建议吗?

【问题讨论】:

  • 我将首先更改您的测试以使用 StringReader 以最大程度地减少某些操作系统字符集设置弄乱您的机会。否则,它对我来说看起来不错。您是否检查了生成的 .java 文件以查看可能出了什么问题?

标签: java encoding utf-8 jflex


【解决方案1】:

我最近发现 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 更便携。我还找到了feature request 29,暗示 jFlex 遵循系统默认编码。

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 2021-12-02
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2023-03-03
    相关资源
    最近更新 更多