Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex “在哪里?”;“新线”;(\n)来自哪里?(使用“flex”进行模式匹配)_Apache Flex_Newline_Design Patterns_Matching - Fatal编程技术网

Apache flex “在哪里?”;“新线”;(\n)来自哪里?(使用“flex”进行模式匹配)

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+

我有一个实验性的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++;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