编译原理实验-词法分析器的设计说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
集美大学计算机工程学院实验报告
课程名称:编译原理班级:
指导教师::
实验项目编号:实验一学号:
实验项目名称:词法分析器的设计实验成绩:
一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
二、实验容
编写一个词法分析器,从输入的源程序(编写的语言为C语言的一个子集)中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
三、实验要求
1、词法分析器的功能和输出格式
词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符
2
别单词的类型,将标识符和常量分别插入到相应的符号表中,增加错误处理等。
3、编程语言不限。
四、实验设计方案
1、数据字典
本实验用到的数据字典如下表所示:
3、实验程序
#include
#include
#include
#include
//判断读入的字符是否为字母
bool isLetter(char c){
if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){
return true;
}
else
return false;
}
//判断读入的字符是否为数字
bool isDigit(char c){
if(c >='0' && c <= '9'){
return true;
}
else
return false;
}
//判断是否为关键字
bool isKey(char *string) {
if(!strcmp(string,"void")
|| !strcmp(string,"if")|| !strcmp(string,"for")|| !strcmp(string,"wh ile")
|| !strcmp(string,"do")|| !strcmp(string,"return")|| !strcmp(stri ng,"break")
|| !strcmp(string,"main")|| !strcmp(string,"int")|| !strcmp(strin g,"float")|| !strcmp(string,"char")
|| !strcmp(string,"double")|| !strcmp(string,"String"))
{
return true;
}
else return false;
}
bool isError(char ch){
if(ch == '' || ch == '$' || ch == '&' || ch == '#' || ch == '~' || ch == '^')
{
return true;
}
else
return false;
}
void main()
{
char string[500]="";//存放文件中读出来的字符串
char str[10]="";//存放需要对比的字符串
char ch,c;//ch存放文件中的单个字符(翻译时用),c存放文件中的单个字符(从文件中提取信息时用)
char filename[20];//文件名
int j=0;
printf("请输入文件名进行词法翻译:");
scanf("%s",filename);
FILE *cfPtr;
if((cfPtr=fopen(filename,"r"))==NULL)
printf("文件未找到!");
else{
while(!feof(cfPtr)){
if(isspace(c=fgetc(cfPtr))){//判断是否是字符串
;
}else{
string[j]=c;//从文件中一一提取字符
j++;
}
}
}
int m = 0,k=0;//m翻译时用,k是str数组的下标
string[j]=' ';
j++;
bool check=true,error=false;//用于判断标识
for(int i = 0;i < j;i++){//实现语法翻译器
switch (m)
{
case 0:
ch = string[i];
if(ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '='
|| ch == '>' || ch == '<')
{
if(error){
printf("%s,此字符无法是识别!\n",str);
error=false;
check=true;
}else if(!check){
printf("(2,%s)标示符\n",str);
check=true;
}
m = 4;
}
else if(ch == ',' || ch == ';' || ch == '{' || ch == '}' || ch == '(' || ch == ')')
{
if(error){
printf("%s此字符无法识别\n",str);
error=false;
check=true;
}else if(!check){
printf("(2,%s)标示符\n",str);
check=true;
}
m = 5;
}
else if ( isDigit((ch =string[i]) ) )
{
if(check){
memset(str, 0, strlen(str));//清空
k=0;
str[k]=ch;
k++;
m = 3;
check=false;
} else{
str[k]=ch;