编译器的第一个工作是需要去除代码中的注释。这里分析的代码是C源代码。我们知道在C代码中,有两种类型的注释。
1. 块注释。以/*开头,以*/结尾,可以包含多行。
2. 行注释。以//开头直至行末尾。
要去除这两块的注释本身不是难事,比较麻烦的是处理有双引号的情形。例如考虑下面的代码段。
int main()
{
printf("/* Hello the world");
}
在这段代码中,虽然出现块注释起始符‘/*’,但是不可以将‘/*’后面的字符串看做是注释,因为’/*’出现在双引号内。
为了删除注释,我们需要定义如下非终结符。
<prog>表示整个源代码段,它是文法定义中的初始非终结符。
<line_comment>表示代码段中的行注释片断。
<block_comment>表示代码段中的块注释片断。
<quote>表示代码段中的引用字符串,即C语言中的字符串常量。
<norm_block>表示代码段中非注释,非引用的片段。
一个代码段本质是一个字符串,而一个字符串由一列的字符组成。接下来我们将源码中可能出现的字符进行分类。
<norm_char>:普通字符。包括a-zA-Z0-9_,运算符,括号,空格,单引号等。这类字符在删除注释时,无需特殊处理。
<double_quote_mark>:双引号。是引用字符串的开始和结束标记。
<enter>&#x