例如,我应该将“int”转换为“INT”。但是如果有“整数”这个词,我认为它不应该变成“整数”。
如果我定义"int" printf("INT");
子字符串匹配。有没有办法防止这种情况发生?
我相信以下内容可以满足您的需求。
%{
#include <stdio.h>
%}
ws [\t\n ]
%%
{ws}int{ws} { printf ("%cINT%c", *yytext, yytext[4]); }
. { printf ("%c", *yytext); }
要将其扩展到单词边界之外({ws}
在本例中为 , ),您将需要添加修饰符ws
或添加更多特定检查。
好吧,我是这样做的:
(("int"([a-z]|[A-Z]|[0-9])+)|(([a-z]|[A-Z]|[0-9])+"int")) ECHO;
"int" printf("INT");
欢迎提出更好的建议。
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();
}