我们正在尝试解析GEDCOM文件格式。根据其标准,CR和LF的所有组合都有效表示换行符。
这是一种基于行的格式,因此,当我们已经匹配数字和标记时,我们通常希望匹配行的其余部分。规则的一个例子是
"NAME ".+ { /* deal with the name */ }
新行与
匹配[\r\n]+ {return ENDLINE;}
这在Windows上运行正常,因为它将\ r \ n转换为\ n在你的背后,但它并不在Linux上。在那里,\ r \ n可以与点匹配。由于Flex使用最长的匹配规则,它将在数据中包含\ r,或者它将已知标记与UNKNOWNTAG规则匹配,因为此技术上正确的匹配将长一个字节
解决方案可能是用[^ \ r \ n]替换所有点,但这看起来不够优雅。还有更好的方法吗?
答案 0 :(得分:0)
您可以使用重新定义YY_INPUT将\r
替换为\n
:
%{
#define YY_INPUT(buf,result,max_size) { \
int c = getc(yyin); \
buf[0] = (c == '\r') ? '\n' : c; \
result = 1; \
}
%}