简单来说, lex的正则表达式并没有特别的语义
\0 表示转义0, 所以这个对应char hex 00
\\ 表示转义 \, 所以这个对应单个char backslash '\', hex 5c
所以 \\0 = \\ + 0, 对应一个转义的\ + 一个ascii 0 (hex 0x30) = hex 0x 5c 30
同理 \\\0 = \\ + \0 对应一个转义的\ + 一个转义的0 = hex 0x 5c 00
以此类推,给楼主一个可以运行的例子
$cat d
%%
^0$ printf("0 found at line %d, len=%d\n", yylineno, yyleng);
^\0$ printf("\\0 found at line %d, len=%d\n", yylineno, yyleng);
^\\0$ printf("\\\\0 found at line %d, len=%d\n", yylineno,yyleng);
^\\\0$ printf("\\\\\\0 found at line %d, len=%d\n", yylineno, yyleng);
^\\\\0$ printf("\\\\\\\\0 found at line %d, len=%d\n", yylineno, yyleng);
\n ++yylineno;ECHO;
%%
vim里面看到的input file内容,^@ 表示hex 00
1 start line
2 0
3 ^@
4 \0
5 \^@
6 \\0
7 \\^@
8 \\\0
9 end line
od的显示
$od -ta input
0000000 s t a r t sp l i n e nl 0 nl nul nl \
0000020 0 nl \ nul nl \ \ 0 nl \ \ nul nl \ \ \
0000040 0 nl e n d sp l i n e nl
0000053
运行的结果
$./test < input
start line
0 found at line 2, len=1
\0 found at line 3, len=1
\\0 found at line 4, len=2
\\\0 found at line 5, len=2
\\\\0 found at line 6, len=3
\\
\\\0
end line