Lex没有归还我想要的东西

时间:2018-10-09 22:04:36

标签: c++ yacc lex

%{
#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。因此,任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

  • 您在致电n_chars之前先打印yylex
  • .的最后一条规则将不会与上述规则之一匹配的任何内容匹配,因此使用这种方法将不会获得字符数。

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

要计算所有字符,您可以

  • 在前四个规则中添加语句n_chars += strlen (yytext);,以计算该规则匹配的字符。
  • 将语句REJECT添加到前四个规则以继续搜索,并因此将.与动作++n_chars;相匹配。