我正在尝试编写 lex 代码,它将接受一个输入,然后查找并打印它在大型字典文本文件中找到的该输入的第一个排列。这是我目前所拥有的:
%{
#include <stdio.h>
%}
%option noyywrap
%%
INPUT GOES HERE { //Not sure what expression to put here
printf("Longest is: %s", yytext);
return;
}
.|\n { }
%%
int main(void)
{
yylex();
return 0;
}
我觉得我必须使用状态,但我不太熟悉它们的工作原理。有人可以指出我正确的方向吗?
编辑:如果有人需要,这里是已接受答案的代码:
%{
#include <stdio.h>
#include <string.h>
%}
%option noyywrap
%%
^[ablm]{4}$ {
char originalWord [5];
strcpy(originalWord, yytext);
char input[5] = {"ablm"};
char tmp;
int i, j;
for(i=0; i<4; i++)
{
for (j=i+1; j<4; j++)
{
if (yytext[i] > yytext[j])
{
tmp=yytext[i];
yytext[i]=yytext[j];
yytext[j]=tmp;
}
}
}
if(strcmp(input,yytext)==0){
printf("First permutation is: %s", originalWord);
return;
}
else
;
}
.|\n { }
%%
int main(void)
{
yylex();
return 0;
}
最佳答案
正则表达式本身并不倾向于对“以下符号的某些排列”形式的字符串进行字符串匹配。您可以编写与某些字符串的排列匹配的正则表达式,但为此您(或多或少)必须写出这些字符的所有排列,然后将它们全部组合在一起。
一种更简单的方法是使用一个正则表达式来匹配所有具有适当长度且由从相关字符串中获取的符号组成的字符串。然后,您可以将一个操作与该正则表达式相关联,该正则表达式将接收候选字符串,然后使用普通 C 代码来确定该字符串是否是原始字符集的排列。这应该非常快,因为在真实字典中误报的数量可能非常低,并且处理候选匹配所花费的时间也不是很多。
希望这对您有所帮助!
关于c - Lex:查找输入的第一个排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14668189/