我想制作一个词法分析器来检测可被4整除的数字 示例代码 -
%%
16(divisible by 4) {printf("divisible by 4 %s\n",yytext);}
%%
main()
{
yylex();
}
答案 0 :(得分:3)
可被4整除的一位数字是0,4和8。
可被4整除的两位数字可分为两组:
12, 16, 32, 36, 52, 56, 72, 76, 92, 96
20, 24, 28, 40, 44, 48, 60, 64, 68, 80, 84, 88
任何三位或更多位数以及任何这两位数字结尾的数字都可以被四整除。
因此,正则表达式应搜索表单\d*[02468][048]
或表单\d*[13579][26]
或单个数字0
,4
和{{ 1}}。
此正则表达式匹配所有可被4整除的数字,正数或负数:
8
请注意,这可以匹配部分数字,例如-?(?:\d*[02468][048]|\d*[13579][26]|[048])
中的24
。如果您想确保只匹配整个数字,可以添加负面的环顾表达式:
1245
或者你可以使用单词边界:
(?<!\d)-?(?:\d*[02468][048]|\d*[13579][26]|[048])(?!\d)
答案 1 :(得分:0)
%%
[0-9]+ {int number = atoi(yytext); if((number % 4) == 0) printf("Div_4 %d\n", number);}
%%
main()
{
yylex();
}
由于lex/flex
支持C,因此您可以将字符串保存为整数,然后在C中进行检查。