如何在 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;
}

我认为使用插入符 (^) 字符我会匹配除空格以外的任何字符,但相反,它正在删除 ws 来自输入。
那么有谁知道我怎样才能否定空格?另外,欢迎任何其他解决问题的方法。
提前谢谢你。

在 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.