一个lex程序,找到最长的字符串然后反转它

时间:2015-01-21 06:07:57

标签: regex compiler-construction yacc lex

嗨我在这个程序中遇到问题我不知道怎样才能得到最长的字符串然后反转它plz帮助我。我想到的R.E这是

[a-zA-z]{8,} 

但是我在这里指定限制但是我想用限制来做它也让我知道如何扭转它

  %{

 char string;
%}
longest [a-zA-z]{8,} 


%%
{longest}  { string=yytext;}


%%
 #include <stdio.h>
 #include <string.h>
# include <iostream.h>
void main()
{  yylex();
    cout << "Longest string is = " << string<<endl;
    cout << "longest string in reverse is " << strrev(string) << endl;

}

int yywrap (void) {return 1;}

1 个答案:

答案 0 :(得分:1)

lex无法在输入流中获取字符串,它识别从开始到结束的字符序列。所以你需要正则表达式用于你的“最长字符串”和其他标记(分隔符)。

然后你需要一个result字符串变量。每次识别令牌时,都应该比较result和令牌的长度。如果令牌更长,则必须将其存储为result

<强> longest.lex

%option nounistd
%option noyywrap

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

char* longest;
%}

longest     [a-zA-Z]{8,}

%%

{longest}   {
            if (yyleng > strlen(longest)) {
                longest = (char*)realloc(longest, yyleng + 1);
                strcpy(longest, yytext);
            }
        }
<*>.|\n     /* skip all unrecognized text */

%%

int main() {
    longest = (char*)malloc(1);
    longest[0] = '\0';
    yylex();
    printf("Longest string is '%s'\n", longest);
    strrev(longest);
    printf("Longest reverse string is '%s'\n", longest);
    free(longest);
    return 0;
}