我的 lex 程序不工作

My lex program isn't working

/* 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 程序。我想让它计算源中有多少个元音字母和多少个辅音字母..

我有 2 个问题:

  1. 直到执行 Ctrl+C 并停止执行后,我才在 yylex 之后得到 printf。所以 yylex 不让任何指令在它之后执行,除非我退出停止整个执行

  2. 我没有得到正确的数字。 例如 "good", 我得到了 1 个元音和 1 个辅音,而不是 2 个元音和 2 个辅音。

我需要做什么来解决这些问题?

  1. 您的 lex 规则从不 return,因此扫描将继续直到到达输入末尾。如果您从控制台提供输入,则需要通过在一行的开头键入 Control-D (linux/mac) / Control-Z (windows) 来发送输入结束。

  2. 您的第一条规则匹配任何元音。您的第二条规则匹配任何后跟非元音字母的字母。所以 good 中的匹配项是:

    • g 默认规则
    • o 规则 1(元音)
    • od 规则 2(辅音)

    可能跟在good后面的换行符也会被默认规则匹配。

  3. 注意"anything which is not a vowel"和"a consonant"是有区别的。例如,! 不是元音。

  4. lex 默认规则(如果没有其他字符与该点的输入匹配,则该规则恰好匹配一个字符)将该字符打印到标准输出。这几乎肯定不是您想要的,因此您应该添加自己的不执行任何操作的后备规则。