实验一、词法分析实验
商业软件工程专业 张煌 201506110130
一、 实验目的
从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生以{种别码,属性}为格式的结果。
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词符号本身)
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中
源程序名词法分析.c
可执行程序名:词法分析.exe
链接: http://pan.baidu.com/s/1dFl0Tsl 密码: iuw6
2. 原理分析及流程图
存储结构:数组input存输入的字符串,数组output存要输出的字符串
3. 主要程序段及其解释:
{ //忽略空格回车tab while(input[*pos]=='\n'||input[*pos]=='\t'||input[*pos]==' ')(*pos)++; //识别出字母 if(input[*pos]>='A'&&input[*pos]<='z') { int i=1; //识别出一个单词 for((*pos)++;input[*pos]>='A'&&input[*pos]<='z'||input[*pos]>='0'&&input[*pos]<='9';i++,(*pos)++); //判断是标识符还是保留字 if(!strncmp(&input[*pos]-i,"begin",5)) { strcat(output,"{1,begin}"); } else if(!strncmp(&input[*pos]-i,"if",2)) { strcat(output,"{2,if}"); } else if(!strncmp(&input[*pos]-i,"then",4)) { strcat(output,"{3,then}"); } else if(!strncmp(&input[*pos]-i,"while",5)) { strcat(output,"{4,while}"); } else if(!strncmp(&input[*pos]-i,"do",2)) { strcat(output,"{5,do}"); } else if(!strncmp(&input[*pos]-i,"end",3)) { strcat(output,"{6,end}"); } else { strcat(output,"{10,"); strncat(output,&input[*pos]-i,i); strcat(output,"}"); } } //识别出数字 else if(input[*pos]>='0'&&input[*pos]<='9') { int i=1; //识别出无符号整数 for((*pos)++;input[*pos]>='0'&&input[*pos]<='9';i++,(*pos)++); strcat(output,"{11,"); strncat(output,&input[*pos]-i,i); strcat(output,"}"); } //识别出符号 else { switch(input[*pos]) { case '+': { strcat(output,"{13,+}"); (*pos)++; break; } case '-': { strcat(output,"{14,-}"); (*pos)++; break; } case '*': { strcat(output,"{15,*}"); (*pos)++; break; } case '/': { strcat(output,"{16,/}"); (*pos)++; break; } case '(': { strcat(output,"{27,(}"); (*pos)++; break; } case ')': { strcat(output,"{28,)}"); (*pos)++; break; } case '#': { strcat(output,"{0,#}"); (*pos)++; return 0; } case ';': { strcat(output,"{26,;}"); (*pos)++; break; } case '=': { strcat(output,"{25,=}"); (*pos)++; break; } case ':': { (*pos)++; if(input[*pos]=='=') { strcat(output,"{18,:=}"); (*pos)++; } else { strcat(output,"{17,:}"); } break; } case '<': { (*pos)++; if(input[*pos]=='=') { strcat(output,"{21,<=}"); (*pos)++; } else if(input[*pos]=='>') { strcat(output,"{22,<>}"); (*pos)++; } else { strcat(output,"{20,<}"); } break; } case '>': { (*pos)++; if(input[*pos]=='=') { strcat(output,"{24,>=}"); (*pos)++; } else { strcat(output,"{23,>}"); } break; } } } return 1; }
- 4. 运行结果及分析