莱克斯没有返回我想要的东西

Lex is not returning what I want

本文关键字:我想要 返回      更新时间:2023-10-16
%{
#include<stdio.h>
int n_chars = 0;
int n_lines = 0;
%}

%%
"if"|"else"|"while"|"do"|"switch"|"case" {
printf("Keyword");
}
[a-zA-Z][a-z|0-9]* {printf("Identifier");}
[0-9]* {printf("Number");}
"!"|"@"|"*"|"&"|"^"|"%"|"$"|"#" {printf("Special Character");}
n      { ++n_lines, ++n_chars; }
.       ++n_chars;
%%
int yywrap() {
return 1;
}
main(int argc[], char *argv[]) {
yyin = fopen("index.txt", "r");
printf("Number of characters is: %d", n_chars);
yylex();
return 0;
}

我上面的代码返回:字符数为:0

我的文件index.txt的内容是:

如果你好#

而 1

做测试

为什么它会返回0?我期望的是所有字符的数量,它还应该告诉我它是keywordidentifier还是special character

我一定做错了什么,因为我对此很陌生。 我正在使用 EditPlus。因此,任何帮助将不胜感激!

你的代码至少有两个问题。

  • 在调用yylex之前打印n_chars
  • .的最后一个规则不会与上述规则之一匹配的任何规则匹配,因此使用此方法不会获得字符数。

首先调用yylex,我得到"其他"字符的数量,例如空格和换行符。

要计算所有字符,您可以

  • 将语句n_chars += strlen (yytext);添加到前四个规则中,以计算与规则匹配的字符。
  • 将语句REJECT添加到前四个规则中以继续搜索,从而将.与操作++n_chars;进行匹配。