regex - 莱克斯/雅克 : using global variables and finding the longest occurance

标签 regex compiler-construction yacc lex flex-lexer

我正在尝试找到由字母组成的最长单词 [ghijklpqrswxyz].. 这似乎是一个简单的问题,但我想我在理解如何 lex/yaac 有效。我正在使用 linux/usr/share/dict/words 文件和程序来测试它 simple 返回整个单词列表,而不是打印最长的单词..

% lex example.l
% cc lex.yy.c -ll
% ./a.out < /usr/share/dict/words

问题出在哪里?

%{
char* longest="";
%}

%option noyywrap

%%
^[ghijklpqrswxyz]+$    {if (strlen(yytext)>strlen(longest)) {longest = yytext;}}
.|\n    {;}
%%

int main(void)
{
    yylex();
    printf("The longest matching word: %s\n", longest);
    return 0;
}

最佳答案

yytext 的值被覆盖。您将需要复制并复制该值,而不是简单地分配它:

longest = malloc(sizeof(char)*strlen(yytext)); strcpy(longest, yytext);

请记住,您将需要清除(释放)最长的连续值。但请注意不要释放静态分配的值longest = "";!

关于regex - 莱克斯/雅克 : using global variables and finding the longest occurance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22147403/

相关文章:

c# - 如何在使用 CodeDom 编译之前检查编译错误

regex - Lex 程序从给定文本中删除单行和多行注释

Java正则表达式递归匹配

jquery - 我可以对正则表达式使用字符编码吗?

javascript - 用于匹配共享相同格式部分的 URL 的正则表达式

java - 在Java中,变量名可以和类名相同

c++编译器错误类没有名为的成员

c - 如何在 yacc 文件中查找 shift/reduce 冲突

ocaml - ocamlyacc 的详细错误

javascript - 将 <a> 标签包裹在 http 文本周围