[英]Lex: How do I Prevent it from matching against substrings?
例如,我应该将“int”转换为“INT”。 但如果有“整数”这个词,我认为它不应该变成“INTeger”。
如果我定义"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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.