3

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

这是一种基于行的格式,所以当我们已经匹配了数字和标签时,我们经常想要匹配行的其余部分。一个规则的例子是

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

换行符由

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

这在 Windows 上运行良好,因为它在你背后将 \r\n 转换为 \n,但在 Linux 上却不行。在那里,\r 可以通过点匹配。因为 Flex 使用最长匹配规则,它要么在数据中包含 \r,要么将已知标记匹配到 UNKNOWNTAG 规则,因为这种技术上正确的匹配将长一个字节

一个解决方案可能是用 [^\r\n] 替换所有点,但这似乎不优雅。有没有更好的办法?

4

1 回答 1

0

您可以使用重新定义 YY_INPUT 来\r替换\n

%{
#define YY_INPUT(buf,result,max_size) {  \
        int c = getc(yyin);              \
        buf[0] = (c == '\r') ? '\n' : c; \
        result = 1;                      \
    }
%}
于 2017-04-02T22:44:07.887 回答