我的lex程序无效

问题描述 投票:2回答:1
/* 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. 我没有得到正确的数字。例如,对于“好”,我得到1个元音和1个辅音,而不是2个元音和2个辅音。

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

c lex lexical-analysis
1个回答
3
投票
  1. 您的lex规则永远不会返回,因此扫描将继续,直到达到输入结束。如果您从控制台提供输入,则需要通过在行的开头键入Control-D(linux / mac)/ Control-Z(窗口)来发送输入结束。
  2. 你的第一条规则匹配任何元音。你的第二条规则匹配任何字母后跟非元音。所以good的比赛是: g默认规则 o规则1(元音) od规则2(辅音) 可能跟随good的换行符也将与默认规则匹配。
  3. 请注意,“不是元音的任何东西”和“辅音”之间存在差异。例如, !不是元音。
  4. lex默认规则(如果没有其他任何东西与该点的输入匹配,则恰好匹配一个字符)将字符打印到stdout。这几乎肯定不是你想要的,所以你应该添加你自己的后备规则,什么都不做。
© www.soinside.com 2019 - 2024. All rights reserved.