问题描述
我是 Lex (Flex) 的新手,我正在解决一个问题,该问题要求我编写一个复制文件的 lex 程序,用一个空格替换每个非空的空格序列。 这是我尝试过的
%{
FILE *rp,*wp;
/*Read pointer and write pointer*/
%}
delim [ \t\n]
ws {delim}+
Nows [^{ws}]
%%
{Nows} {fprintf(wp,"%s",yytext);}
{ws} {fprintf(wp,"%c",' ');}
%%
int yywrap(){}
int main(int argc,char** argv){
rp=fopen(argv[1],"r");
wp=fopen(argv[2],"w+");
yyin=rp;
yylex();
fclose(yyin);
fclose(wp);
return 0;
}
我认为使用插入符号 (^) 字符我会匹配除空格以外的任何字符,但相反,它从输入中删除了 w 和 s。
那么有谁知道我怎样才能否定空格?另外,欢迎使用任何其他方法来解决问题。
提前致谢。
解决方法
借助 Alfred V Aho 和 Jeffrey D Ullman 关于编译器的书的帮助,这里有一个解决上述问题的方法。
ws 可以定义为 ws [\t \n]+
,nows 可以定义为 nows .
。
尽管 .
用于匹配所有字符,但由于 ws
将首先写入,因此,lex 在看到空格字符时将匹配此规则。
因此完整的代码变成了
%{
#include<stdio.h>
FILE *rp,*wp;
/*Read pointer and write pointer*/
%}
ws [\t \n]+
nows .
%%
{nows} {fprintf(wp,"%s",yytext);}
{ws} {fprintf(wp," ");}
%%
int yywrap(){}
int main(int argc,char** argv){
rp=fopen(argv[1],"r");
wp=fopen(argv[2],"w");
yyin=rp;
yylex();
fclose(yyin);
fclose(wp);
return 0;
}
这是一个演示程序工作的输入和输出文件
输入.txt
This is a test file for
the
program copy.l This file must be properly
formatted.
Here we are trying to
write some gibberish
Also here is some line.
这是它的输出
输出.txt
This is a test file for the program copy.l This file must be properly formatted. Here we are trying to write some gibberish Also here is some line.