一旦我们通过setSource方法设置好要解析的源字符串或者调用reset方法进行重新解析字符串时,则需要一些操作来获取当前字符或探测下一个字符,我们可以使用这几个成员方法,代码如下所示:

  1. //获得当前的索引指向的char,并且将索引加1,后移一位
  2. //后++特点是返回当前的索引,并将索引加1
  3. //这样的话,_getChar返回的是当前要处理的char,而索引指向的是下一个要处理的char
  4. private _getChar ( ) : string {
  5. //数组越界检查
  6. if ( this._currIdx >= 0 && this . _currIdx < this . _source . length ) {
  7. return this . _source . charAt ( this . _currIdx ++ ) ;
  8. }
  9. return "" ;
  10. }
  11. //探测下一个字符是什么
  12. //很微妙的后++操作
  13. private _peekChar ( ): string {
  14. //数组越界检查,与_getChar区别是并没移动当前索引
  15. if ( this . _currIdx >= 0 && this . _currIdx < this . _source.length ) {
  16. return this . _source . charAt ( this . _currIdx ) ;
  17. }
  18. return "" ;
  19. }
  20. private _ungetChar ( ) : void {
  21. //将索引前移1位,前减减操作符
  22. if ( this . _currIdx > 0 ) {
  23. -- this . _currIdx ;
  24. }
  25. }

  到此为止,我们构建了IDoom3Tokenizer词法解析器最小的运行环境,我们可以设置(setSource)或重置(reset)要解析的数据源,我们可以正向的获取(_getChar)当前字符,或探测(_peekChar)下一个字符,也可以反向归还(_ungetChar)一个字符。我们还可以知道当前字符是数字字符(_isDigit)或者是空白符(_isWhiteSpace)。下一小节我们将进入Token解析阶段。