1

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

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

4

3 回答 3

2

我相信以下内容可以满足您的需求。

%{
#include <stdio.h>
%}

ws                      [\t\n ]

%%

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

要将其扩展到单词边界之外({ws}在本例中为 , ),您将需要添加修饰符ws或添加更多特定检查。

于 2010-03-02T01:30:53.977 回答
1

好吧,我是这样做的:

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

欢迎提出更好的建议。

于 2010-03-01T21:46:42.727 回答
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();
   }
于 2010-03-02T01:18:37.230 回答