C Lex:查找输入的第一个排列
我正在尝试编写lex代码,它将接受一个输入,然后找到并打印它在大型字典文本文件中找到的输入的第一个排列。这就是我到目前为止所做的:C Lex:查找输入的第一个排列,c,regex,lex,flex-lexer,C,Regex,Lex,Flex Lexer,我正在尝试编写lex代码,它将接受一个输入,然后找到并打印它在大型字典文本文件中找到的输入的第一个排列。这就是我到目前为止所做的: %{ #include <stdio.h> %} %option noyywrap %% INPUT GOES HERE { //Not sure what expression to put here printf("Longest is: %s", yytext); return; } .|\n { } %%
%{
#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;
}
%{
#包括
%}
%选项No yywrap
%%
输入放在这里{//不确定放在这里的表达式
printf(“最长为:%s”,yytext);
返回;
}
.|\n{}
%%
内部主(空)
{
yylex();
返回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;
}
%{
#包括
#包括
%}
%选项No yywrap
%%
^[ablm]{4}${
字源字[5];
strcpy(原文,yytext);
字符输入[5]={“ablm”};
char-tmp;
int i,j;
对于(i=0;i正则表达式,对于形式为“以下符号的某些排列”的字符串,本机不支持字符串匹配。您可以编写与某些字符串的排列相匹配的正则表达式,但要做到这一点,您(或多或少)必须写出这些字符的所有排列,然后或将它们全部写在一起
一种更简单的方法是使用一个正则表达式来匹配所有长度合适的字符串,这些字符串由从相关字符串中提取的符号组成。然后,您可以将一个操作与该正则表达式关联,该正则表达式将接收候选字符串,然后使用普通C代码来确定字符串是原始字符集的排列。这应该非常快,因为在真正的字典中,误报的数量可能非常少,并且处理候选匹配所花费的时间也不是很大
希望这能有所帮助!我不太清楚为什么要用lex来做这样的事情。一种简单而有效的测试方法就是对字典中的单词字母和输入进行排序(任何排序方法都可以,但计数排序就可以了)。任何排列都必须具有相同的字母和字母数量。如果不想将原始字符串计算为排列,只需测试并确保它不是原始字符串。对于大型词典,可能需要使用某种排序数据结构
从理论上讲,状态机总是可以用来验证置换,但它的大小会随着组合的增加而增加
meth|meht|mteh|mhet|mthe|mhte|emth|emht|tmeh|hmet|tmhe|hmte|etmh|ehmt|temh|hemt|thme|htme|ethm|ehtm|tehm|hetm|them|htem
或混合
m(e(th|ht)|t(he|eh)|h(te|et))|
e(m(th|ht)|t(hm|mh)|h(tm|mt))|
t(e(mh|hm)|m(he|eh)|h(me|em))|
h(e(tm|mt)|t(me|em)|m(te|et))