📜  从 C 程序中删除注释的 Lex 程序(1)

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

从 C 程序中删除注释的 Lex 程序介绍

程序简介

该程序使用 Lex 工具来实现从 C 程序中删除注释的功能。

Lex 程序代码
%{
#include <stdio.h>
%}

%%

"/*"    {
            int i, j, k;
            char c;
            i = j = k = 0;
            while ((c = input())) {
                if (c == '*') {
                    i = 1;
                } else if (c == '/') {
                    j = 1;
                }
                if (i && j) {
                    break;
                }
            }
            if (c == EOF) {
                yyterminate();
            }
        }

"//"    {
            while (input() != '\n') {
                ;
            }
        }

.           {
            printf("%c", yytext[0]);
        }

%%

int main()
{
    yylex();
    return 0;
}
程序说明
Lex 程序结构

Lex 程序主体由三部分组成:定义部分、规则部分、C 代码部分。

定义部分

定义部分由 %{%} 括起来,其中定义需要在 Lex 程序中使用的头文件或全局变量等。

规则部分

规则部分由多个模式匹配的规则组成,每个规则由一个正则表达式和一段 C 代码构成。

C 代码部分

当有输入匹配到某个规则时,对应规则中的 C 代码将被执行。其中提供了yytextyyleng两个变量,用于表示当前匹配到的字符串和字符串长度。

程序具体操作说明

处理 /* 注释

匹配到 /* 的时候,便可确定注释的起始位置,然后循环读取每一个字符,如果出现了 *,则标记 i 为 1,如果标记 i 已经为 1 了,则表示注释即将结束,接下来的字符如果是 /,就标记 j 为 1。如果 ij 都为 1,则表示注释已经结束,跳出循环即可。

处理 // 注释

匹配到 // 的时候,就可以确定注释的起始位置,然后循环读取每一个字符,如果出现了 \n 则表示注释结束,跳出循环即可。

输出处理后的代码

如果读取的不是注释,则将读取的字符输出即可。

参考资料