Lex:我如何防止它与子串相匹配?

时间:2010-03-01 21:37:22

标签: c lex

例如,我应该将“int”转换为“INT”。但如果有“整数”这个词,我认为它不应该变成“INTeger”。

如果我定义"int" printf("INT");,则匹配子串。有没有办法防止这种情况发生?

3 个答案:

答案 0 :(得分:2)

我相信以下内容可以捕获您想要的内容。

%{
#include <stdio.h>
%}

ws                      [\t\n ]

%%

{ws}int{ws}         { printf ("%cINT%c", *yytext, yytext[4]); }
.                       { printf ("%c", *yytext); }

要将此扩展到单词边界(在这种情况下为{ws}),您需要向ws添加修饰符或添加更多特定检查。

答案 1 :(得分:1)

嗯,这就是我的表现:

(("int"([a-z]|[A-Z]|[0-9])+)|(([a-z]|[A-Z]|[0-9])+"int")) ECHO;
"int" printf("INT");

欢迎提出更好的建议。

答案 2 :(得分:1)

Lex将选择与当前输入匹配最长的规则。要避免子字符串匹配,您需要包含一个长于int的附加规则。最简单的方法是添加一个简单的规则来获取长度超过一个字符的任何字符串,即[a-zA-Z]+。整个lex程序看起来像这样: -

%%

[\t ]+          /* skip whitespace */
int { printf("INT"); }
[a-zA-Z]+       /* catch-all to avoid substring matches */

%%

int main(int argc, char *argv[])
   {
   yylex();
   }