在 Lex 中删除空 space

Deleting empty space in Lex

当前我正在尝试使用 lex 和 c 删除文件中的空字符串。我的代码如下;

%{
#include<stdio.h>
#include<string.h>
%}
keyword hava|su
ques "?"|"!"
%%
{keyword} {

yytext[0]=toupper(yytext[0]);
printf("%s",yytext);
}
{ques} {
if(yytext[-1]==' '){
ECHO;yytext++;
 }
 printf("%s", yytext);
 } 
  %%
 int main()
{
//yyin=fopen("test.txt","r");
yylex();
return 0;
}
int yywrap()
{
return 1;
}

我看到一个问号附近是空的space,我的目的是立即删除它。但是我没有这样做;我不知道该怎么做。我尝试了一个复制数组并在那里复制新字符串,但由于我正在从文件中读取,所以出现错误。

另一个任务是制作"ques"个标点符号后的字符;也在那里,我无法达到+1个字符。

为了到达前后字符,我使用 yytext[-1] 和 yytext[1] 代码,-1 用于检测空 space 但 +1 无法从标点符号中找到后字符.可能是什么问题?

我的文件如下;

hava gibi, su gibi, güneş gibi, toprak gibi vazgeçilmezdi. Onunla yatılıp onunla kalkılıyordu ve yaratıcı gücünün sonsuzluğuna, edebiyatın insanı insan yapma büyüsüne İnanılıyordu. Toplumun yozlaşmaya ve her şeyin parayla ölçüldüğü, bilgi ve kültüre duyulan saygının, kredi kartlarına, görselliğe yönelmeye başladığı yıllarda, edebiyat "Bir işlevi yok." ? düşüncesiyle gazetelerden kovuldu. Edebiyat kovulunca da gazeteler çirkinleşti, gazetelerle birlikte dil de espri de düşünce de sığlaşıp yüceliğini yitirdi ?Bense ona öylece bakıyordum?

这是我的代码版本,似乎可以正常工作。请注意,我通过用 {} 包围它们来识别映射的关键字,并且通过用 [] 包围它们来识别映射的问号和感叹号。这有助于让我确信它正在做我期望的事情。除了作为调试助手,我不会将它们保留在生产代码中。

tk11.l

%{
#include <ctype.h>
#include <stdio.h>
#include <string.h>
%}

%option noinput
%option nounput

keyword hava|su
ques [ \t]*[?!]
%%

{keyword}   { yytext[0] = toupper(yytext[0]); printf("{%s}", yytext); }
{ques}      { printf("[%s]", &yytext[yyleng-1]); } 
.           { ECHO; }

%%

int main(void)
{
    yylex();
    return 0;
}

int yywrap(void)
{
    return 1;
}

data

这是从问题

复制的来自土耳其语的单行 601 个字符(根据 http://translate.google.com/
hava gibi, su gibi, güneş gibi, toprak gibi vazgeçilmezdi. Onunla yatılıp onunla kalkılıyordu ve yaratıcı gücünün sonsuzluğuna, edebiyatın insanı insan yapma büyüsüne İnanılıyordu. Toplumun yozlaşmaya ve her şeyin parayla ölçüldüğü, bilgi ve kültüre duyulan saygının, kredi kartlarına, görselliğe yönelmeye başladığı yıllarda, edebiyat "Bir işlevi yok." ? düşüncesiyle gazetelerden kovuldu. Edebiyat kovulunca da gazeteler çirkinleşti, gazetelerle birlikte dil de espri de düşünce de sığlaşıp yüceliğini yitirdi ?Bense ona öylece bakıyordum?

如果分散在多行会更好,但是...

输出:

$ ./tk11 < data
{Hava} gibi, {Su} gibi, güneş gibi, toprak gibi vazgeçilmezdi. Onunla yatılıp onunla kalkılıyordu ve yaratıcı gücünün son{Su}zluğuna, edebiyatın insanı insan yapma büyüsüne İnanılıyordu. Toplumun yozlaşmaya ve her şeyin parayla ölçüldüğü, bilgi ve kültüre duyulan saygının, kredi kartlarına, görselliğe yönelmeye başladığı yıllarda, edebiyat "Bir işlevi yok."[?] düşüncesiyle gazetelerden kovuldu. Edebiyat kovulunca da gazeteler çirkinleşti, gazetelerle birlikte dil de espri de düşünce de sığlaşıp yüceliğini yitirdi[?]Bense ona öylece bakıyordum[?]
$

可以看到,havasu已经被截取并大写了,问号前的空格也没有了。

注意sonsuzluğuna音译为son[Su]zluğuna;将整个单词作为关键字处理需要更多规则,小心处理代码集土耳其语部分的非拉丁字母字符。