编译原理实验一 词法分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一词法分析
本节进行词法分析程序的编程与调试。
1.实验要求
(1)从源程序文件中读取有效字符和并将其转换成二元组内部表示形式输出。
(2)掌握词法分析的实现方法。
(3)实验时间4学时。
(4)实验完成后,要上交实验报告(包括源程序清单)。
2.实验内容
2.1主程序设计考虑:
主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。
id 和ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。
主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;调用词法分析过程;输出每个单词的内部码(种别编码,属性值)。建议从文件中读取要分析的符号串。
2.2词法分析过程考虑
该过程根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词种别,产生种别编码。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id 中,将常数存入数组中ci 中,并记录其在表中的位置。
注:所有识别出的单词都用二元组表示。第一个表示单词的种别编码。例如:关键字的t=1;标识符的t=2;常数t=3;运算符t=4;界符t=5。第二个为该单词在各自表中的指针或内部码值(常数表和标识符表是在编译过程中建立起来的。其i 值是根据它们在源程序中出现的顺序确定的)。
将词法分析程序设计成独立一遍扫描源程序的结构。其主流程图如下:
图1 词法分析程序流程图
3.程序源代码
// 11.cpp : 定义控制台应用程序的入口点。
//
#include "iostream.h"
#include "string.h"
#define NUM 5
//using namespace std;
void main()
{
char aa[NUM];
static char id[100][50],ci[100][20];
char
aa1[30][20]={"int","char","float","void","const","if","else","do","while","scanf","printf","return", "main","read"};
id[0][0]='\0';ci[0][0]='\0';
char
aa4[30][20]={"+","-","*","/","%","=","==",">","<","!=",">=","<=","&&","||","!","<>","++","--"};
char aa5[30][20]={"(",")","{","}",";",",",",",","""};
cout<<"想要退出,请输esc"< cout<<"请输入任意字符串表示程序开始"< cin>>aa; while(strcmp("esc",aa)!=0) { cin>>aa; if(aa[0]>='A'&& aa[0]<='Z') { int i,m; for(i=0;i<14;i++) { if(strcmp(aa1[i],aa)==0) { cout<<"种别编码:t=1,内部编码:i="< break; } } if(i>=14) { for(i=0;i<100;i++) { if(id[i][0]=='\0') { m=i; break; } } for(i=0;i { if(strcmp(id[i],aa)==0) { cout<<"种别编码:t=2,内部编码:i="< break; } } if(i>=m) { strcpy(id[m],aa); id[m+1][0]='\0'; cout<<"种别编码:t=2,内部编码:i="< } } } if(aa[0]>='0'&& aa[0]<='9') { int i,n; for(i=0;i<100;i++) { if(ci[i][0]=='\0') { n=i; break; } } for(i=0;i { if(strcmp(ci[i],aa)==0) { cout<<"种别编码:t=3,内部编码:i="< break; } } if(i>=n) { strcpy(ci[n],aa); ci[n+1][0]='\0'; cout<<"种别编码:t=3,内部编码:i="< } } else { int i; for(i=0;i<20;i++) { if((strcmp(aa4[i],aa)==0)) { cout<<"种别编码:t=4,内部编码:i="< break; } } for(i=0;i<20;i++) { if((strcmp(aa5[i],aa)==0)) { cout<<"种别编码:t=5,内部编码:i="< break; } } } } }