一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
二、实验内容
程序输入/输出示例:
如源程序为C语言。输入如下一段:
main()
{
int a,b;
a = 10;
b = a + 20;
}
要求输出如下:
(2,”main”)
(5,”(“)
(5,”)“)
(5,”{“)
(1,”int”)
(2,”a”)
(5,”,”)
(2,”b”)
(5,”;”)
(2,”a”)
(4,”=”)
(3,”10”)
(5,”;”)
(2,”b”)
(4,”=”)
(2,”a”)
(4,”+”)
(3,”20”)
(5,”;”)
(5,”}“)
要求:
识别保留字:if、int、for、while、do、return、break、continue;
单词种别码为1。
其他的都识别为标识符;单词种别码为2。
常数为无符号整形数;单词种别码为3。
运算符包括:+、-、*、/、=、>、<、>=、<=、!= ;
单词种别码为4。
分隔符包括:,、;、{、}、(、); 单词种别码为5。
三、实验大致过程
四、实验步骤
c语言的源程序存放在code.txt中,只要用到三个函数来实现词法分析:预处理函数、扫描判断单词类型的函数以及主函数.
1、在预处理函数process()中,使用文档操作函数打开源程序文件code.txt,去除两种类型(“//”,“/…/”)的注释、多余的空格合并为一个、换行符、回车符等,然后将处理后的保存在另一个新的文件result.txt中,最后关闭文档.
2、打开result.txt文件,调用扫描函数,从文件里读取一个单词调用判断单词类型的函数与之前建立的符号表进行对比判断,最后格式化输出。
五、实验代码
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
using namespace std;
int aa;// fseek的时候用来接着的
string word="";
string reserved_word[20];//保留
char buffer;//每次读进来的一个字符
int num=0;//每个单词中当前字符的位置
int line=1; //行数
int row=1; //列数,就是每行的第几个
bool flag; //文件是否结束了
int flag2;//单词的类型
//预处理函数
int process(){
FILE *p;
int falg=0,len,i=0,j=0;
char str[1000],str1[1000],c;
if((p=fopen("code.txt","rt"))==NULL){
printf("无法打开要编译的源程序");
return 0;
}else{
while((c=getc(p))!=EOF){
str[i++] = c;
}
fclose(p);
str[i] = '\0';
for(i=0;i<strlen(str);i++){
if(str[i]=='/'&&str[i+1]=='/'){
//单行注释必然以换行符结束
while(str[i++]!='\n'){
}
}else if(str[i]=='/'&&str[i+1]=='*'){
//多行注释
while(!(str[i]=='*'&&str[i+1]=='/')){
i++;}
i+=2