📅  最后修改于: 2023-12-03 15:06:30.443000             🧑  作者: Mango
该程序使用 Lex 工具来实现从 C 程序中删除注释的功能。
%{
#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 程序主体由三部分组成:定义部分、规则部分、C 代码部分。
定义部分由 %{
和 %}
括起来,其中定义需要在 Lex 程序中使用的头文件或全局变量等。
规则部分由多个模式匹配的规则组成,每个规则由一个正则表达式和一段 C 代码构成。
当有输入匹配到某个规则时,对应规则中的 C 代码将被执行。其中提供了yytext
和yyleng
两个变量,用于表示当前匹配到的字符串和字符串长度。
匹配到 /*
的时候,便可确定注释的起始位置,然后循环读取每一个字符,如果出现了 *
,则标记 i
为 1,如果标记 i
已经为 1 了,则表示注释即将结束,接下来的字符如果是 /
,就标记 j
为 1。如果 i
和 j
都为 1,则表示注释已经结束,跳出循环即可。
匹配到 //
的时候,就可以确定注释的起始位置,然后循环读取每一个字符,如果出现了 \n
则表示注释结束,跳出循环即可。
如果读取的不是注释,则将读取的字符输出即可。