我需要使用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();
}
}
关于这个问题有什么想法或建议吗?
最佳答案
我最近发现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支持系统默认编码。关于java - JFlex和重音字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16571232/