【发布时间】:2012-04-20 20:01:10
【问题描述】:
我编写了一个解析 ASCII 文件的 xml 解析器,但我现在需要能够读取 UTF-8 编码的文件。我在 lex 中有以下正则表达式,但它们与 UTF-8 不匹配。我不确定我做错了什么:
utf_8 [\x00-\xff]*
bom [\xEF\xBB\xBF]
然后:
bom { fprintf( stderr, "OMG I SAW A BOM"); return BOM;}
utf_8 { fprintf( stderr, "OMG I SAW A UTF CHAR", yytext[0] ); return UTF_8;}
我还有以下语法规则:
program
: UTF8 '<' '?'ID attribute_list '?''>'
root ...
UTF8 在哪里:
UTF8
: BOM {printf("i saw a bom\n");}
| UTF_8 {printf("i saw a utf\n");}
| {printf("i didn't see anything.'\n");}
;
它总是出现i didn't see anything,我的解析器适用于 ASCII 文件,即当我将 XML UTF-8 文件复制粘贴到一个空文档中时。
任何帮助将不胜感激。
编辑:
这是一个修剪后的 .l 文件供参考:
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "y.tab.h"
int lines = 1;
%}
utf_8 [\x0000-\xffff]*
bom [\xEF\xBB\xBF]
whitespace [ \t]
ev (.|{bom})
ev1 (.|{utf_8})
%%
{whitespace} { fprintf( stderr, "%s", yytext );}
\n { fprintf( stderr, "%s%d ", yytext, lines++ );}
. { fprintf( stderr, "{TOKEN:%c}", yytext[0] ); return yytext[0];}
bom { fprintf( stderr, "OMG I SAW A BOM"); return BOM;}
utf_8 { fprintf( stderr, "OMG I SAW A UTF CHAR", yytext[0] ); return UTF_8;}
%%
void error( char *message )
{
fprintf( stderr, "Error: %s\n", message );
exit(1);
}
【问题讨论】:
-
究竟是哪个“lex”你使用的是?有些可以处理高字节集的字符,有些不能,有些严格面向字节,有些处理代码点等。
-
另外,一个完整的
.l文件将不胜感激。 -
@Zack c `flex' 版本 2.5.35
-
好的,你似乎想要做的事情应该与
flex一起工作。不过,如果没有完整的 flex 输入文件,我将无能为力。 -
@Zack 我刚刚添加了一个修剪过的 .l 文件。