code: public List<Token> scan() {
  		while (peek() != EOF) {
  			if (peek() == '#') {
  				if (scanDire()) {
  					continue ;
  				}
  				if (scanSingleLineComment()) {
  					continue ;
  				}
  				if (scanMultiLineComment()) {
  					continue ;
  				}
  				if (scanNoParse()) {
  					continue ;
  				}
  			}
  			
  			scanText();
  		}
  		return tokens;
  	}
docs: 进入每个扫描方法之前 peek() 处于可用状态，不需要 next()
  每个扫描方法内部是否要 next() 移动，取决定具体情况
  每个扫描方法成功返回前，将 forward 置于下一次扫描需要处理的地方
  让下个扫描方法不必 next()
  紧靠 scanText() 之前的扫描方法在失败后必须保持住forward
  这是 scanText() 可以一直向前的保障