编译原理——词法分析器

这篇博客详细介绍了编译原理中的词法分析器实验,目的是深入理解词法分析原理,并通过C语言源程序为例,展示词法分析的过程。实验内容包括识别保留字、标识符、常数、运算符和分隔符,以及处理注释和空格。实验步骤包括预处理、扫描和判断单词类型。词法分析器在编译器中起到关键作用,不仅识别词素,还过滤注释和空白,并关联错误消息与源程序位置。
摘要由CSDN通过智能技术生成

一、实验目的

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值