如何使用Flex处理不同的换行约定

时间:2017-04-01 19:51:11

标签: regex flex-lexer gedcom

我们正在尝试解析GEDCOM文件格式。根据其标准,CR和LF的所有组合都有效表示换行符。

这是一种基于行的格式,因此,当我们已经匹配数字和标记时,我们通常希望匹配行的其余部分。规则的一个例子是

"NAME ".+               { /* deal with the name */ }

新行与

匹配
[\r\n]+             {return ENDLINE;}

这在Windows上运行正常,因为它将\ r \ n转换为\ n在你的背后,但它并不在Linux上。在那里,\ r \ n可以与点匹配。由于Flex使用最长的匹配规则,它将在数据中包含\ r,或者它将已知标记与UNKNOWNTAG规则匹配,因为此技术上正确的匹配将长一个字节

解决方案可能是用[^ \ r \ n]替换所有点,但这看起来不够优雅。还有更好的方法吗?

1 个答案:

答案 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;                      \
    }
%}