📌  相关文章
📜  Lex程序在给定的输入文件中打印总字符,空格,制表符(1)

📅  最后修改于: 2023-12-03 15:32:38.664000             🧑  作者: Mango

Lex程序统计总字符、空格、制表符

介绍

Lex是Unix系统上的一个工具,它可以根据输入文件的正则表达式来执行一些相应的动作,常用于词法分析器的生成。在这个项目中,我们需要编写一个Lex程序,统计给定的输入文件中的总字符数、空格数和制表符数。

实现思路

我们可以编写一个Lex脚本,用于对输入文件进行扫描,并在其中加入统计字符数、空格数和制表符数的逻辑。具体的流程如下:

  • 定义3个变量用于统计总字符数、空格数和制表符数。
  • 定义正则表达式,用于匹配空格和制表符。
  • 在匹配到空格或制表符时,相应地递增变量。
  • 每次读取一个字符时,总字符数递增。

最终,我们会得到输入文件中的总字符数、空格数和制表符数。这些统计信息可以被输出到终端或另一个文件中,以供进一步分析。

代码实现

以下是实现上述思路的Lex程序示例:

%{
int character_count = 0;
int space_count = 0;
int tab_count = 0;
%}

%%

[ \t] { 
    if(yytext[0] == ' ') {
        ++space_count;
    } else if(yytext[0] == '\t') {
        ++tab_count;
    }
}

. { ++character_count; }

%%

int main(int argc, char **argv) {
    if(argc != 2) {
        printf("Usage: %s FILE\n", argv[0]);
        return 1;
    }

    FILE *file = fopen(argv[1], "r");

    if(file == NULL) {
        perror("fopen");
        return 1;
    }

    yyin = file;
    yylex();

    printf("Total characters: %d\n", character_count);
    printf("Spaces: %d\n", space_count);
    printf("Tabs: %d\n", tab_count);

    fclose(file);

    return 0;
}

在上述代码中,我们首先使用了%{%}来定义一些变量。在这种情况下,我们定义了3个整型变量,用于统计总字符数、空格数和制表符数。接下来,采用%%分隔符,定义了两个规则:

  • [ \t]:匹配空格或制表符。
  • .:匹配除换行符以外的任意字符。

当匹配到空格或制表符时,代码中的逻辑会将相应的计数器递增。当匹配到除换行符以外的字符时,总字符数的计数器会被递增。

在主函数中,程序会读取argv[1]中指定的文件,并使用yyin进行扫描。扫描完成后,程序会输出统计信息。

使用方法

以上述代码为例,我们可以使用以下命令编译并运行程序:

lex file_stats.l
gcc -o file_stats lex.yy.c -ll
./file_stats input.txt

其中,file_stats.l为上述代码所保存的文件名,input.txt为需要进行统计的文件名。