⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 6.cpp

📁 构造一个简单程序设计语言的词法分析器
💻 CPP
字号:
#include<stdio.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
const int WORDLEN=20;
struct code_val
{	
	char code;
	char val[WORDLEN];
};//定义二元组的数据结构
void pro_process(char*);//预处理程序
code_val scanner(char*);//扫描预处理后的程序并返回二元组
char reserve(char[]); //判断是否为保留字
void main()
{	
	char buf[4048]={"\0"};//缓冲区用来存放预处理结果
	pro_process(buf);
	cout<<buf<<endl;//输出预处理后缓冲区中的内容
	ofstream coutf("F:\lex_r.txt",ios::out);
	code_val t;
	do
	{
		t=scanner(buf);
		cout<<'('<<t.code<<','<<t.val<<')'<<endl;
	}while(t.code!='#');//预处理时在程序末尾加一个#用来判断扫描结束
}
void pro_process(char*buf)//此程序将源程序中空格,回车,tab,换行都由一个空格代替,将大写字母替换为相应小写最后加一个'#'.
{	ifstream cinf("F:\source.txt",ios::in);
	int i=0;
	char cur_c;
	int k=0;
	while(cinf.read(&cur_c,sizeof(char)))
	{	
		if(cur_c==' '||cur_c=='\t'||cur_c=='\n')
		{
			if(k==0)
			{	
				buf[i]=' ';
				k=1;
			}
			else
				i--;
		}//将源程序中空格,回车,tab,换行都由一个空格代替
		else if(cur_c>='A'&&cur_c<='Z')
		{	
			cur_c+=32;
		     k=0;
			 buf[i]=cur_c;
		}//大写字母替换为相应小写
		else 
		{   k=0;
			if(cur_c=='+'||cur_c=='-'||cur_c==':'||cur_c=='<'||cur_c=='>'||cur_c==';'||cur_c=='('||cur_c==')'||cur_c==',')
			{	
				buf[i]=' ';
				i++;
				buf[i]=cur_c;
				i++;
				buf[i]=' ';
			}
			else  buf[i]=cur_c;
		}	//遇到界符和运算符时则在前后加空格
		if(cur_c=='=')
		{
				k=0;
				if(buf[i-2]==':')
				{	i--;
					buf[i]=cur_c;
					i++;
					buf[i]=' ';
				}
				else
				{	
				buf[i]=' ';
				i++;
				buf[i]=cur_c;
				i++;
				buf[i]=' ';
				}
		}
		i++;
	}
		buf[i]='#';//结尾加结束标志
}
struct code_val scanner(char*buf)
{	static int i=0;
	struct code_val t={'\0',"NUL"};
	char token[WORDLEN]={'\0'};
	while(buf[i]==' ')i++;//空格不处理
	if(buf[i]>='a'&&buf[i]<='z')
		{	
			int k=0;
			while(buf[i]>='a'&&buf[i]<='z'||buf[i]>='0'&&buf[i]<='9')
			{
				token[k]=buf[i];
				k++;
				i++;
			}
			t.code=reserve(token);
			if(t.code=='a')
			strcpy(t.val,token);
			return t;
		}	//识别基本字或标识符
	else if(buf[i]>='0'&&buf[i]<='9')
		{		
			int k=0;
			while(buf[i]>='0'&&buf[i]<='9')
			{	
				token[k]=buf[i];
				k++;
				i++;
			}
			if(buf[i]==' ')
			{
				t.code='b';
				strcpy(t.val,token);
				return t;
			}
			else
				cout<<"Error char!"<<token<<endl;
		}//识别无符号整数
	if(buf[i]=='+')
	{
		t.code ='+';
		i++;
		return t;
	}
	else if(buf[i]=='-')
	{
		t.code ='-';
		i++;
		return t;
	}
	else if(buf[i]=='<')
	{
		t.code ='<';
		i++;
		return t;
		
	}
	else if(buf[i]=='>')
	{
		t.code ='>';
		i++;
		return t;
	}
	else if(buf[i]=='#')
	{
		t.code ='#';
		return t;
	}
	else if(buf[i]==':')
	{
		i++;
		if(buf[i]=='=')
		{
			t.code='$';
			i++;
			return t;
		}
		else
		{	
			t.code=':';
			return t;
		}
	}
	else if(buf[i]=='(')
	{
		t.code ='(';
		i++;
		return t;
	}
	else if(buf[i]==')')
	{
		t.code =')';
		i++;
		return t;
	}
	else if(buf[i]==';')
	{
		t.code =';';
		i++;
		return t;
	}
	else if(buf[i]=='=')
	{
		t.code ='=';
		i++;
		return t;
	}
	else if(buf[i]==',')
	{	
		t.code=',';
		i++;
		return t;
	}
	else 
		cout<<"Error char!"<<buf[i]<<endl;
				exit(0);	
}
char reserve(char token[])//判断是否为保留字
{
	const char*table[]={"program","begin","end","var","integer","if","then","else","do","while"};
	const char code[]={"1234567890"};//保留字的二元组定义
	for(int i=0;i<10;i++)
		if(strcmp(token,table[i])==0)
			return code[i];
		return'a';//若不是则返回标识符的属性值‘i’
}//end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -