上一篇博文介绍了去除代码注释的思想。我们发现,代码注释准确来说,不属于上下文无关文法的范畴。也就是同样的一个字符串,在不同的上下文环境下语义有所不同。为了对付这种情况,需要在字符解析时引入状态变量。
我们实现的过程,主要分为两个部分。
- 首先将输入字符串整理成一个Token。这里的Token在文法规则中对应的终结符。
- 有了第一部分的工作,生成的Token流就可以通过上下文无关文法进行分析了。这也是程序实现的第二部分内容。
这两部分内容将分为两篇博文讲解。本文先介绍第一部分的内容。
首先是Token数据结构的定义。
class Token{
public:
int type, value;
const static int END_OF_FILE = EOF;
const static int BLCOK_COMMENT_START = 0;
const static int LINE_COMMENT_START = 1;
const static int NORM_CHAR = 2;
const static int BLOCK_COMMENT_END = 3;
const static int DOUBLE_QUOTE_MARK = 4;
const static int ENTER = 5;
const static int CONVERT_CHAR = 6;
const static int NONE = 7;
Token(int type=Token::NONE, int value=-1