栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

词法分析器

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

词法分析器

词法分析器
  • 1. 实验要求
  • 2. 分析与设计
    • 2.1 构造c语言子集
    • 2.2 单词符号表
    • 2.3 状态转换图
  • 3. 程序描述
    • 3.1 数据结构
    • 3.2 主要函数
    • 3.3 算法描述
  • 4. 运行测试
  • 5. 源代码

1. 实验要求

手工设计c语言的词法分析器(可以式c语言子集)
处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中

2. 分析与设计 2.1 构造c语言子集

第一类:标识符 letter(letter | digit)* 无穷集
第二类:常数 (digit)+ 无穷集
第三类:保留字
main,int,char,if,else,for,while
第四类:界符 () { } [ ] , ;
第五类:运算符 <、<=、>、>=、=、+、-、*、/,==

2.2 单词符号表

2.3 状态转换图

3. 程序描述 3.1 数据结构
typedef struct 
{
	string code;//种别码
	string attr;//属性值
}node;//返回的二元组
3.2 主要函数
bool isdigit(char c);//判断是不是数字
bool ischar(char s);//判断是不是字符
bool isremain(string s);//判断是不是保留字
string read_filter(char *filename);//从文件中读取字符串并将字符串中无用的符号过滤掉
queue LEX(string s);//词法分析
void print(queue res);//打印词法分析结果,存放于文件中
3.3 算法描述

1.打开源文件source.txt,读取文件所有内容,存放在string s中。
2.对读取的文件进行预处理,从头到尾进行扫描,去除//注释的内容,以及换行符、回车符、制表符。
3.创建队列res(元素为node),用于返回分析结果。
4.对s每个字符从头到尾进行扫描
若当前的字符是空格,则继续扫描下一个字符。
若不是空格:
判断字符是不是字母,若是则进行标识符和保留字的识别;
若这个字符为数字,则进行数字的判断。
否则,依次对这个字符可能的情况进行判断。
每次成功识别了一个单词后,创建新的node t,将单词种别码和单词属性值存入其中,然后将t加入队列res中。
5.将结果存入result.txt文件中

4. 运行测试

5. 源代码
#include 
#include 
#include 
#include
#include 
#include 
using namespace std;
typedef struct 
{
	string code;//种别码
	string attr;//属性值
}node;
string remained[7]={"main","int","char","if","else","for","while"};//保留字
bool isdigit(char c);//判断是不是数字
bool ischar(char s);//判断是不是字符
bool isremain(string s);//判断是不是保留字
string read_filter(char *filename);//从文件中读取字符串并将字符串中无用的符号过滤掉
queue LEX(string s);//词法分析
void print(queue res);//打印词法分析结果,存放于文件中

//判断是不是数字
bool isdigit(char c)
{
	if(c>='0'&&c<='9')
		return 1;
	return 0;
}

//判断是不是字符
bool ischar(char c)
{
	if(c>='a'&&c<='z'||c>='A'&&c<='Z')
		return 1;
	return 0;
}

//判断是不是保留字
bool isremain(string s)
{
	for(int i=0;i<7;i++)
	{
		if(s==remained[i])
			return 1;
	}
	return 0;
}

//从文件中读取字符串并将字符串中无用的符号过滤掉
string read_filter(string filename)
{
	string s="";
	ifstream infile;
	infile.open(filename);
	while(!infile.eof())
	{
		char temp[90];
		infile.getline(temp,80);
		s+=temp;
		s+='n';
	}
	string res="";
	int len=s.length ();
	for(int i=0;i LEX(string s)
{
	queue res;
	int len=s.length();
	node t;
	for(int i=0;i':{
					i++;
					if(s[i]=='=')
					{t.code="21";t.attr =">=";res.push(t);break;}
					else
					{t.code="20";t.attr =">";res.push(t);i--;break;}
					}
				case '=':{
					i++;
					if(s[i]=='=')
					{t.code="23";t.attr ="==";res.push(t);break;}
					else
					{t.code="22";t.attr ="=";res.push(t);i--;break;}
					}
               case '+':{t.code="24";t.attr ="+";res.push(t);break;}
			   case '-':{t.code="25";t.attr ="-";res.push(t);break;}
               case '*':{t.code="26";t.attr ="*";res.push(t);break;}
               case '/':{t.code="27";t.attr ="/";res.push(t);break;}
			   default:{t.code="ERROR";t.attr ="--";res.push(t);}
				}
			}
		}
	}
	return res;
}

//将结果存放在文件"result.txt"中
void print(queue res)
{
	ofstream out("result.txt",ios::out);
	int i=0;//控制输出格式
	while(!res.empty())
	{
		node temp;
		temp=res.front();
		res.pop();
		out< res=LEX(s);
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302961.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号