精品文档
编译方法实验报告
实验1:扫描器的设计
一、 实验目的
熟悉并实现一个扫描器(词法分析程序)。
。
1欢迎下载
精品文档
二、 实验要求
(1) 设计扫描器的有限自动机(识别器);
(2) 设计翻译、生成Token的算法(翻译器); (3) 编写代码并上机调试运行通过。
·输入——源程序文件或源程序字符串; ·输出——相应的Token序列;
关键字表和界符表; 符号表和常数表;
三、 实验步骤
流程:
初始化;
打开用户源程序文件;
while (文件未结束)
{ 读入一行到w[i],i=0;
do //处理一行,每次处理一个单词
{ 滤空格,直到第一个非空的w[i]; i--;
s=1; //处理一个单词开始
while (s!=0) //拼单词并生成相应Token {
act(s); //执行qs
if (s>=11 && s<=14) //一个单词处理结束 break;
i++; //getchar() s=find(s, w[i]); }
if (s==0) 词法错误;
}while (w[i]!=换行符); }
关闭用户源程序文件; 生成Token文件; 输出关键字表; 输出Token序列; 输出符号表; 输出常数表;
有限自动机的状态转换图:
e
。 2欢迎下载
精品文档
d d d +|- -1/+/- +① d ② . ③ d ④ e ⑤ ⑥ d ⑦ 11 d - -1/+/- l/d -1/+/- -1 12 l ⑧ - -1 13 b ⑨ b ⑩ - -1 14 - -1 15 - 其中:d为数字,l为字母,b为界符,-1代表其它符号(如在状态8处遇到了非字母或数字的其它符号,会变换到状态12)。
关键字表和界符表:
Program Begin End Var While Do Repeat Until For To If Then Else
; : ( ) , := + - * / > >= == < <= 四、 主要数据结构
①状态转换矩阵:int aut[10][7]={ 2, 0, 0, 0, 8, 9, 15,
2, 3, 5,11, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 4, 0, 5,11, 0, 0, 11, 7, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0,11, 0, 0, 11,
。 3欢迎下载
精品文档
8, 0, 0, 0, 8, 0, 12, 0, 0, 0, 0, 0, 10, 14,
0, 0, 0, 0, 0, 0, 13};
②关键字表:
char keywords[30][12]={“program”,”begin”,”end”,”var”,”while”,”do”,
”repeat”,”until”,”for”,”to”,”if”,”then”,”else”,
“;”, ”:”, ”(“, ”)”, ”,”, ”:=”, ”+”, ”-“, ”*”, ”/”, ”>”, ”>=”, ”==”, “<”, “<=”};
③符号表:char ID[50][12]; //表中存有源程序中的标识符
④常数表:float C[20]; ⑤其它变量: struct token { int code;
int value}; //Token结构 struct token tok[100]; //Token数组 int s; //当前状态
int n,p,m,e,t; //尾数值,指数值,小数位数,指数符号,类型
float num; //常数值
char w[50]; //源程序缓冲区
int i; //源程序指针,当前字符为w[i] char strTOKEN[12]; //当前已经识别出的单词
五、 实验核心代码
int main(int argc, char* argv[])
{
FILE *fp;
int s; //当前状态 *有限自动机中的状态
fp=fopen(\ while (!feof(fp)) {
fgets(w,50,fp); i=0;
//*处理一行 do {
printf(\测试 显示每个token的首字母
。 4欢迎下载
精品文档
//*处理一个token
while (w[i]==' ') //滤空格 i++;
if (w[i]>='a' && w[i]<='z') //判定单词类别 *是字母(关键字或标识符)
{
ptr=col2; num_map=2; } else if (w[i]>='0' && w[i]<='9') //*是数字(常量的开头)
{
ptr=col1; num_map=4; } else if (strchr(col3[0].str,w[i])==NULL) //*其他字符 算为非法字符
{
printf(\非法字符%c\\n\ i++;
continue; }
else //界符
{
ptr=col3; num_map=1; }
i--; //*向后退一个字符
s=1; //开始处理一个单词
while (s!=0) {
act(s);
if (s>=11 && s<=14) //*判断是否是终止状态 *是终止状态,则形成一个token
break;
i++; //getchar() *读取下一个字符
s=find(s,w[i]); //状态转换 }
if (s==0) {
strTOKEN[i_str]='\\0';
。 5欢迎下载