/* def*/
%{
#include <stdio.h>
int vowelCount = 0;
int consonantCount = 0;
%}
/*RULES*/
%%
[aeiouAEIOU] {vowelCount = vowelCount + 1;}
[A-Za-z][^aeiouAEIOU] {consonantCount = consonantCount + 1;}
%%
/*fct*/
int main(void)
{
yylex();
printf ("il y a %d voyelles",vowelCount);
printf ("il y a %d consonnes",consonantCount);
return 0;
}
这是我的第一个lex计划。我希望它能算出来源中有多少个元音和多少个辅音..
我有两个问题:
我不能在yylex之后获得printf
直到执行Ctrl + C并停止执行。因此,除非我退出停止整个执行,否则yylex不会在其后面执行任何指令
我没有提供正确的数字。 例如,对于&#34; good&#34;, 我有1个元音和1个辅音,而不是2个元音和2个辅音。
我需要做些什么才能解决这些问题?
答案 0 :(得分:3)
您的lex规则永远不会返回,因此扫描将一直持续到输入结束。如果您从控制台提供输入,则需要通过在行的开头键入Control-D(linux / mac)/ Control-Z(窗口)来发送输入结束。
您的第一条规则与任何元音相匹配。你的第二条规则匹配任何字母后跟非元音。所以good
中的匹配是:
可能跟随good
的换行符也将与默认规则匹配。
请注意,&#34;任何不是元音&#34;和#34;辅音&#34;。例如,!不是元音。
lex默认规则(如果没有其他任何内容与该点的输入匹配,则只匹配一个字符)将字符打印到stdout。这几乎肯定不是你想要的,所以你应该添加你自己的后备规则,什么都不做。