我写了一个简单的lex文件来识别C关键字。我的规则如下:
keyword do|while|char|if
%%
{keyword} { printf("Keyword %s found.", yytext); }
问题是规则在源代码中正确识别char
,但它还将putchar
之类的内容标识为关键字char
。如何强制规则仅识别关键字char
,而不是在其他字词中出现时?
答案 0 :(得分:2)
您需要在标识符之前添加关键字。这就是全部。 Lex正在按顺序搜索正则表达式。
%%
IF|ELSE|etc {action for keywords }
[a-zA-Z_][a-zA-Z0-9]* {action for identifiers}
%%
答案 1 :(得分:0)
您的词法分析器必须匹配其他内容(包括与“put”子字符串匹配的内容),以便区分关键字和非关键字。
如果我正在编写词法分析器,我会通过匹配可能的标识符并使用查找表来识别生成的标记中的关键字来简化它。