《TypeScript图形渲染实战:2D架构设计与实现》 —2.2.12 实现_getString方法解析字符串

举报
华章计算机 发表于 2019/12/11 17:05:03 2019/12/11
【摘要】 本节书摘来自华章计算机《TypeScript图形渲染实战:2D架构设计与实现》 一书中第2章,第2.2.12节,作者是步磊峰。

2.2.12  实现_getString方法解析字符串

  本节来看一下正常的字符串是如何解析的,实现代码如下:

 

// 进入该函数,说明肯定不是数字,不是单行注释,不是多行注释,也不是子字符串

// 进入该函数只有两种类型的字符串,即不带双引号或单引号的字符串及specialChar

private _getString ( token: Doom3Token ): void {

    // 获取当前字符,因为前面已经判断为字符串了

    let c : string = this . _getChar ( ) ;

    token . setType ( ETokenType . STRING ) ;

    // 进入循环

    do {

        //将当前的char添加到Token中

        token . addChar ( c ) ;

          

        if ( ! this . _isSpecialChar ( c ) ) {

            c = this . _getChar ( ) ; // 只有不是特殊操作符号的字符,才调用_getChar

                                                        移动当前索引

        }

        //如果this . _isSpecialChar ( c )为true,不会调用_getChar()函数,并且

        满足了跳出while循环的条件

       //结束条件:数据源解析全部完成,或下一个是空白符或者当前字符是特殊符号

     } while ( c . length > 0 && ! this._isWhitespace ( c ) && !

     this._isSpecialChar ( c ) ) ;

}

 

  代码注释比较详细,各位读者可以了解一下。这里会看到,和子字符串不同的一点是,_getString会将一些特殊的字符(标点符号)作为单独的Token返回,具体有哪些特殊的字符,其实依赖于个人的决策。在默认情况下,实现代码如下:

 

// 将左边和右边的大、中、小括号及点号逗号都当作单独的Token进行处理

// 如果想要增加更多的标点符号作为Token,可以在本函数中进行添加

private _isSpecialChar ( c : string ) : boolean {

    switch ( c ) {

        case '(' :

            return true ;

        case ')' :

            return true ;

        case '[' :

            return true ;

        case ']' :

            return true ;

        case '{' :

            return true ;

        case '}' :

            return true ;

        case ',' :

            return true ;

        case '.' :

            return true ;

    }

    return false ;

}

 

  Doom3文本文件词法解析器的源码都演示完毕了,最好的研究源码方式是断点调试,大家可以去本书前言中的“本书配套资源获取方式”介绍的网站下载本章的源码进行调试。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。