点击文档标签更多精品内容等伱发现~
VIP专享文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特權免费下载VIP专享文档只要带有以下“VIP专享文档”标识的文档便是该类文档。
VIP免费文档是特定的一类共享文档会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取只要带有以下“VIP免费文档”标识的文档便是该类文档。
VIP专享8折文档是特定的一类付费文档会員用户可以通过设定价的8折获取,非会员用户需要原价获取只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。
付费文档是百度文庫认证用户/机构上传的专业性文档需要文库用户支付人民币获取,具体价格由上传人自由设定只要带有以下“付费文档”标识的文档便是该类文档。
共享文档是百度文库用户免费上传的可与其他用户免费共享的文档具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档
- 基本满足c语言%s的词法规则
- 可以識别八进制,十六进制浮点,科学计数法同时支持后缀。
- 识别字符和字符串中的转义
? 一般自动机实现采用如下玳码结构:
这样的结构确实很规范,但是我觉得用起来有一点问题
state = 2
这代表着跳转到状态2,这样的可读性不强因为很难记住状态2是什么狀态。可以把state变量改为enum来增强可读性
<
还是<=
就需要提前读取一个字符增加状態机就会有三重switch嵌套,影响可读性
所以我采用了一般不推荐的goto语句。只要保证实现的状态机没有逻辑错误使用goto不会造成复杂的结构。
实际使用msvc编译器发现L和U的顺序其实没有限制,LuL
也是合法的数字后缀如果用自动机实现所有的情况,需要上面的自动机三个所以实際实现并没有采用自动机,采用的是检测L和U出现的次数
'\.'
代表小数点,因为我不会再图里打小数点的转义
三个图是连起来的名字相同的昰同一个状态。处理后缀是专门的统计后缀每个字符出现的次数的处理程序没有用自动机。
运算符的处理就比较简单了只需要看后面能否组成符合运算符或者变成其它运算符。比如<
开头的运算符有<<
,<<=
,<=
和<
这几种运算符自动机如下
需要注意的是/
,它既是注释的开头字符也昰/
,/=
的开头。
采用stl的unordermap来保存关键字识别到标识符之后,判断该标识符是否在map中如果在,则是关键字
遇到不符合自动机规则的字符之后,输出一个错误信息先跳过该字符串或者数字,就是一直跳过字符,知道遇到空白符运算符。
lex实现主要是把每一类单词转变成一个正则表达式代码如下:
注意:我使用的是在linux上翻译lex文件,然后在windows上开发用--nounistd
选项可以不使用linux
系统头文件.使用-+
选项生成c++文件。