Apache flex “在哪里?”;“新线”;(\n)来自哪里?(使用“flex”进行模式匹配)
我有一个实验性的flex源文件(lex.l):Apache flex “在哪里?”;“新线”;(\n)来自哪里?(使用“flex”进行模式匹配),apache-flex,newline,design-patterns,matching,Apache Flex,Newline,Design Patterns,Matching,我有一个实验性的flex源文件(lex.l): %选项noyywrap %{ int chars=0; int字=0; int行=0; %} delim[\t\n] ws{delim}+ 字母[A-Za-z] 数字[0-9] id{letter}({letter}{digit})* 数字{digit}+(.{digit}+)(E[+-]?{digit}+ %% {letter}+{words++;chars+=strlen(yytext);printf(“Word\n”);} \n{chars+
%选项noyywrap
%{
int chars=0;
int字=0;
int行=0;
%}
delim[\t\n]
ws{delim}+
字母[A-Za-z]
数字[0-9]
id{letter}({letter}{digit})*
数字{digit}+(.{digit}+)(E[+-]?{digit}+
%%
{letter}+{words++;chars+=strlen(yytext);printf(“Word\n”);}
\n{chars++;Line++;printf(“Line\n”);}
. {chars++;printf(“SomethingElse\n”);}
%%
int main(argc、argv)
int-argc;
字符**argv;
{
如果(argc>1)
{
如果(!(yyin=fopen(argv[1],“r”))
{
perror(argv[1]);
申报表(1);
}
}
yylex()
printf(“行:%8d\n单词:%8d\n字符:%8d\n”,行、字、字符);
}
我创建了一个名为“input.txt”的输入文件,其中写入了“红苹果”。命令行:
$flex lex.l
$cc lex.yy.c
$./a.out
既然输入文件中没有换行符,为什么lex.l中的“\n”是模式匹配的?(行数应为0,字符数应为9)
(我正在使用OS X)
谢谢您的时间。很可能您的文本编辑器在文件末尾自动插入了换行符。我尝试使用:$echo“red apple”>input.txt
,得到了相同的结果。(我假设echo不会在文件末尾插入换行。)谢谢@jprete!问题解决了!我尝试使用:$echo-n“red apple”>input.txt
,得到了预期的结果。(带-n选项的echo不会输出尾随的换行符)完全正确。作为一个侧重点,在所有文件末尾都有换行符通常是方便的,因此,您可以认为这是一个可接受的条件。
%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);
}
$ flex lex.l
$ cc lex.yy.c
$ ./a.out < input.txt
Word
SomethingElse
Word
Line
lines: 1
words: 2
chars: 10