词法分析器说明文档.docx
- 文档编号:8464751
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:8
- 大小:336.60KB
词法分析器说明文档.docx
《词法分析器说明文档.docx》由会员分享,可在线阅读,更多相关《词法分析器说明文档.docx(8页珍藏版)》请在冰豆网上搜索。
词法分析器说明文档
程序关联数据库说明文档:
建立用于进行词法分析的数据库db_c,并建立三张数据表t_blz,t_dm,t_xx用于存储相关信息,每张表的说明如下:
t_blz:
存储C语言中的32个保留字
列名
数据类型
说明
blz
varchar(8)
分别存储32个保留字,同时也为主键
t_dm:
将源代码分解为单行后,按行存入表中
列名
数据类型
说明
dmzj
int
主键
dm
varchar(MAX)
存储分解后的代码
t_xx:
根据外键对应各行代码,存储各行中的各类单词符号
列名
数据类型
说明
xxzj
int
主键
dmzj
int
外键,与表t_dm中主键dmzj对应
blz
varchar(MAX)
存储每行中保留字
bsf
varchar(MAX)
存储每行中标识符
cs_zs
varchar(MAX)
存储每行中整型常数
cs_ss
varchar(MAX)
存储每行中实型常数
cs_char
varchar(MAX)
存储每行中字符
cs_string
varchar(MAX)
存储每行中字符串
cs_bool
varchar(MAX)
存储每行中布尔型
ysf
varchar(MAX)
存储每行中运算符
jf
varchar(MAX)
存储每行中界符
程序说明文档
制作程序时,新建一个winform程序,并在窗体上添加一个Button,一个ListView,一个Panel和一个OpenFileDialog控件。
在Panel控件中添加一个Label和一人PictureBox控件,各控件经修改的属性如下:
控件类型
属性
Button
Name
btnLod
Text
导入C语言文件
ListView
Name
listViewC
View
Details
Columns
添加九列,列名如下
每列对应的Text属性为C语言代码,保留字,标识符,整型常量,实型常量,字符常量,字符串常量,布尔常量,运算符,界符
Panel
Name
panLoad
BackColor
Aqua
Visible
False
Label
Text
处理中…
Font
宋体,15.75pt,style=Bold
ForeColor
Red
PictureBox
Image
选择一幅具有loading形式的gif动画
完成后界面如下:
后台代码解析:
在最一开始定义9个StringBuilder类型的全局变量用于存储每行中的保留字,标识符,整型常量,实型常量,字符常量,字符串常量,布尔常量,运算符,界符。
为btnLod添加单击事件,事件发生后调用openC控件,调用打开窗口,让用户选择C语言文件,
选择确定并通过合法性验证后,获得文件绝对路径。
当路径不为空时将panLoad置为可见并刷新,进行对C语言文件进行处理,首先使用removedh(stringfileName)将文件中内容读入内存,并去掉/*…*/及中间的注释内容。
完成后写入数据库中的表t_dm中。
接下来进行去掉include语言和//注释工作,从表中读回C语言程序,并以回车键分隔,将每行代码存入数组中,然后逐判断,如何该行代码是否以#include//开头或空行则直接去掉。
同时寻找//字符,如找到,则后面的字符全部删除。
完成后存入数据库。
然后进行宏替换方法如下
在语法正确的前提下,以空格位置获得源宏及目标宏
如:
#defindepi3.14
源宏在两个空格之间,目标宏在第二个空格后。
至此,预处理工作完成。
然后进行词法分析,为了区分各种字符数字,编写分别用于判断标识符,字母及下划线,数字,运算符及界符的函数。
在主体代码中从数据库中一行一行的读取代码,并使用循环一个字一个字的读取单个字符,然后进行判断其属于哪一类,并调用相应函数进行处理
由pdzmxhx(charchr)函数判断输入字符是否为字母及下划线。
具体实现方法为:
通过ASCII判断,即当chr的ASCII在65~90或97~122或chr为下划线时返回true,否则返回false。
由boolpdsz(charchr)函数判断输入字符是否为数字,具体实现方法为:
通过ASCII判断,即当chr的ASCII在48~57返回true,否则返回false。
分别由pdysf(charchr)和pdjf(charchr)判断输入字符是否运算符和界符,具体实现方法为:
通过switchcase进行穷举,如对应返回true,否则返回false。
对于字符及字符串以’\’’及’”’为开始标志。
将读到的字符判断出属于何种类型时,调用想应类型进行处理,如不属于任何类型(如空格)则处理下一个字符。
各处理函数如下:
privatevoidclpsf(stringcompleteStr,refinti)
作用:
对标识符(包括与之构成类似保留字和布尔值)进行处理。
输入参数:
此时处理的那行C语言代码及处理的字符位置。
实现方式:
首先新建一个StringBuilder类型的变量存储标识符,并将第一个字符存入。
然后对第一个字符后的字符进行处理,如果该字符为字母数学或下划线则存入标识符变量中,并处理下一个字符,否则退出循环。
该步完成后,调用数据库中的保留字表进行查找,如该标识符为保留字,则将其存入存储保留字的全局变量中,并返回。
否则继续判断其是否为true或false,如果是,则存入存储布尔值的全局变量中,并返回。
否则将其存入存储标识符的全局变量中,并返回。
privateboolclzs(stringcompleteStr,refinti)
作用:
对整型常量进行处理。
输入参数:
此时处理的那行C语言代码及处理的字符位置。
返回参数:
返回true则处理数值为整数,false为实数
实现方式:
首先新建一个StringBuilder类型的变量存储整数,并新建一个int型变量,存储字符起位置。
然后对前两个字符进行处理,如果前两个字符为’0’,’x’说明为十六进制数,先将0x存入变量中,并将字符位置移动到第三个字符。
如果开头字符为’.’时,说明此数值为实数,返回false。
两步判断完成后,接着对当前字符进行处理,如果该字符为数学则存入标识符变量中,并处理下一个字符,否则退出循环。
该步完成后,对造成退出循环的字符进行判断,如果为’.’、’e’或’E’时则说明此数字为实数,此时将输入参数i赋值为进入函数的初始值。
并返回false。
如果不是由于这三个字符中断,则将数值存入存储整型常量的全局变量中,并返回true。
privatevoidclss(stringcompleteStr,refinti)
作用:
对实型常量进行处理。
输入参数:
此时处理的那行C语言代码及处理的字符位置。
实现方式:
首先新建一个StringBuilder类型的变量存储实数。
然后对前两个字符进行处理,如果前两个字符为’0’,’x’说明为十六进制数,先将0x存入变量中,并将字符位置移动到第三个字符。
完成后接着对每个字符进行判断,如果为数字则存入实数变量,并处理下一个字符。
如果不是则判断该字符,如果为’.’,则将该字符加入变量并处理下一个,如果为’e’或’E’,则也将其加入实数变量,同时判断下一个字符,如果为’+’或’-’同样将其加入实数变量。
完成后将字符位置移动到合适位置。
如果均不是以上情况,则此实数已完成,将其存入全局实数变量中,并返回。
privatevoidclysf(stringcompleteStr,refinti)
作用:
对运算符进行处理。
输入参数:
此时处理的那行C语言代码及处理的字符位置。
实现方式:
对各种运算符时行穷举,并存入对应变量。
privatevoidclzf(stringcompleteStr,refinti)
作用:
对字符进行处理。
输入参数:
此时处理的那行C语言代码及处理的字符位置。
实现方式:
从第一个’\’’后开始寻找找到最近的’\’’,则在两者之中的部分为字符,如时如果该字符恰好为’\’’,则将字符位置再后移一位,并存入对应变量中。
privatevoidclzfc(stringcompleteStr,refinti)
作用:
对字符串进行处理。
输入参数:
此时处理的那行C语言代码及处理的字符位置。
实现方式:
从第一个’’’后开始寻找找到最近的’”’,则在两者之中的部分为字符串,并判断该字符串结束标志是否为经转义的’\”’,如果是则将字符位置再后移一位,重新寻找,直到非转义的’”’为止,完成后存入对应变量中。
对每行代码进行分类处理完成后,寻找类型内容不空的全集变量,并将其存入数据库中对应位置。
最后,全部代码处理完成后,从数据库读出数据,添入ListView中。
程序运行后界面如下:
选择C语言文件
处理中
处理完成
最终结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析器 说明 文档
![提示](https://static.bdocx.com/images/bang_tan.gif)