提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
特点:通用性,跨语言
主流语言都有正则表达式,而且表达式的规则都几乎相同的。
提示:以下是本篇文章正文内容,下面案例可供参考
一、源码展示分析
fprintf(fp, " %-20.6f%-20.6f%-20lu%-30s%-70s\n",
第一部分:%作为格式符号,-20意思离左侧20格,f表示float浮点数,.6表示小数点后6位
%-20.6
第二部分同理
%-20.6
第三部分:%作为格式符号,-20意思离左侧20格,lu表示整数
%-20lu
第三部分:%作为格式符号,-30意思离左侧30格,s表示string
%-30s
第四部分同理
%-70s
二、虚拟项目代码展示分析
///[a-zA-Z0-9]* -> /a*/ 零或多個 a
if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]* except number basically, staring from [a-zA-Z] following by [a-zA-Z0-9]
这里是我当时自己写的备注,说明就是我们可以看到两个部分[a-zA-Z]这个是针对首字母的匹配规则,说明(背景这里是在自研一个toy语言的一个编译阶段的词法解析器)这个token解析要求char的首字母是26英文字符表,不能是别的,而后面的部分可以使字母或数字,使用的是封装好的函数isalpha()
但是后面*的使用说明了必须是由多个,也就是说我们的token不允许单个首字母匹配Identifier token
///Number: [0-9.]+ -> /a./含字母 “a” 以及其後任一個字元的字串,例如 “ab”, “bac” 不成立:“a”; /a+/ 一或多個 a
if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+ integer, decimal number come here
这里是针对数字token,isdigit()即为[0-9.]+ 这里的点表示没有 11连起来这种,这里用的是+表示一个或者多个,而不是针对【】里面的数,所以0-9就是0-9,如果你要11,就是连读两个char=‘1’,而不是直接匹配‘11’,你要12,就读一个char=‘1’再读一个char=‘2’,而不是直接匹配‘12’;
其次这里的解析漏洞:这里不能处理异常数据比如0.12.112.12这个不是一个数,但是解析会将这个错误的输入误认为Number token
总结
提示:这里对文章进行总结:
例如:后续继续对正则表达式进行整理积累。