如何在 lex 中编写否定空格的正则表达式
How to write a regex in lex that negates the whitespaces
我是 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;
}
这是一个演示程序工作的输入和输出文件
input.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.
这是它的输出
output.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.
我是 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;
}
这是一个演示程序工作的输入和输出文件
input.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.
这是它的输出
output.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.