Lex:C 关键字规则未正确识别

Lex: C keyword rules not identifying correctly

我写了一个简单的 lex 文件来识别 C 关键字。我的规则如下:

keyword do|while|char|if
%%
{keyword}  { printf("Keyword %s found.", yytext); }

问题是规则在源代码中正确识别了 char,但它也将 putchar 之类的东西识别为关键字 char。我如何强制规则只识别关键字 char 而不是当它存在时?

你的词法分析器必须匹配其他东西(包括匹配 "put" 子字符串的东西)以允许它区分关键字和 non-keywords.

如果我正在编写词法分析器,我会通过匹配可能的标识符并使​​用查找 table 来识别结果标记中的关键字来简化它。

您需要将关键字放在标识符之前。就这样。 Lex 正在按顺序搜索正则表达式。

%%

IF|ELSE|etc {action for keywords }

[a-zA-Z_][a-zA-Z0-9]* {action for identifiers}

%%