“换行符”(\ n)来自何处? (使用“flex”进行模式匹配)

时间:2011-02-07 21:09:36

标签: flex newline design-patterns matching

我有一个实验性的flex源文件(lex.l):

%option noyywrap
%{
  int chars = 0;
  int words = 0;
  int lines = 0;
%}
delim     [ \t\n]
ws        {delim}+
letter    [A-Za-z]
digit     [0-9]
id        {letter}({letter}|{digit})*
number    {digit}+(.{digit}+)?(E[+-]?{digit}+)?

%%

{letter}+ { words++; chars += strlen(yytext); printf("Word\n"); } \n { chars++; lines++; printf("Line\n"); } . { chars++; printf("SomethingElse\n"); }

%%

int main(argc, argv) int argc; char **argv; { if(argc > 1) { if(!(yyin = fopen(argv[1], "r"))) { perror(argv[1]); return (1); } }

yylex();

printf("lines: %8d\nwords: %8d\nchars: %8d\n", lines, words, chars); }

我创建了一个名为“input.txt”的输入文件,其中写有“红苹果”。命令行:

$ flex lex.l
$ cc lex.yy.c
$ ./a.out < input.txt
Word
SomethingElse
Word
Line
lines:        1
words:        2
chars:       10

由于输入文件中没有换行符,为什么lex.l中的“\ n”是模式匹配的? (“行”应为0,“字符”应为9)

(我使用的是OS X.)

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

您的文本编辑器很可能会在文件末尾自动插入换行符。