我的lex程序不起作用

时间:2017-11-26 13:05:52

标签: c lex lexical-analysis

/* 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计划。我希望它能算出来源中有多少个元音和多少个辅音..

我有两个问题:

  1. 我不能在yylex之后获得printf直到执行Ctrl + C并停止执行。因此,除非我退出停止整个执行,否则yylex不会在其后面执行任何指令

  2. 我没有提供正确的数字。 例如,对于&#34; good&#34;, 我有1个元音和1个辅音,而不是2个元音和2个辅音。

  3. 我需要做些什么才能解决这些问题?

1 个答案:

答案 0 :(得分:3)

  1. 您的lex规则永远不会返回,因此扫描将一直持续到输入结束。如果您从控制台提供输入,则需要通过在行的开头键入Control-D(linux / mac)/ Control-Z(窗口)来发送输入结束。

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

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

    可能跟随good的换行符也将与默认规则匹配。

  3. 请注意,&#34;任何不是元音&#34;和#34;辅音&#34;。例如,不是元音。

  4. lex默认规则(如果没有其他任何内容与该点的输入匹配,则只匹配一个字符)将字符打印到stdout。这几乎肯定不是你想要的,所以你应该添加你自己的后备规则,什么都不做。