我的 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 个问题:
直到执行 Ctrl+C 并停止执行后,我才在 yylex 之后得到 printf
。所以 yylex 不让任何指令在它之后执行,除非我退出停止整个执行
我没有得到正确的数字。
例如 "good",
我得到了 1 个元音和 1 个辅音,而不是 2 个元音和 2 个辅音。
我需要做什么来解决这些问题?
您的 lex 规则从不 return,因此扫描将继续直到到达输入末尾。如果您从控制台提供输入,则需要通过在一行的开头键入 Control-D (linux/mac) / Control-Z (windows) 来发送输入结束。
您的第一条规则匹配任何元音。您的第二条规则匹配任何后跟非元音字母的字母。所以 good
中的匹配项是:
- g 默认规则
- o 规则 1(元音)
- od 规则 2(辅音)
可能跟在good
后面的换行符也会被默认规则匹配。
注意"anything which is not a vowel"和"a consonant"是有区别的。例如,! 不是元音。
lex 默认规则(如果没有其他字符与该点的输入匹配,则该规则恰好匹配一个字符)将该字符打印到标准输出。这几乎肯定不是您想要的,因此您应该添加自己的不执行任何操作的后备规则。
/* 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 个问题:
直到执行 Ctrl+C 并停止执行后,我才在 yylex 之后得到
printf
。所以 yylex 不让任何指令在它之后执行,除非我退出停止整个执行我没有得到正确的数字。 例如 "good", 我得到了 1 个元音和 1 个辅音,而不是 2 个元音和 2 个辅音。
我需要做什么来解决这些问题?
您的 lex 规则从不 return,因此扫描将继续直到到达输入末尾。如果您从控制台提供输入,则需要通过在一行的开头键入 Control-D (linux/mac) / Control-Z (windows) 来发送输入结束。
您的第一条规则匹配任何元音。您的第二条规则匹配任何后跟非元音字母的字母。所以
good
中的匹配项是:- g 默认规则
- o 规则 1(元音)
- od 规则 2(辅音)
可能跟在
good
后面的换行符也会被默认规则匹配。注意"anything which is not a vowel"和"a consonant"是有区别的。例如,! 不是元音。
lex 默认规则(如果没有其他字符与该点的输入匹配,则该规则恰好匹配一个字符)将该字符打印到标准输出。这几乎肯定不是您想要的,因此您应该添加自己的不执行任何操作的后备规则。