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

📄 sample_fun.cpp

📁 你是不是很想要词法分析的源代码呢?!哈哈
💻 CPP
字号:
#include<iostream>
#include <fstream>
#include <string>
#include "myhead.h"
using namespace std;

sample::sample()
{
	cout<<"\n****************************SAMPLE语言词法分析器*******************************\n";
	cout<<"\n                                作者: 林桂川\n";//作者姓名           
	cout<<"\n                            计算机科学与技术04(1)班\n";//班级、学号
	cout<<"\n                                200433099345\n";//学号
	cout<<"请输入测试程序名: ";
	string name;
	filename=getch_blank();
	filename+=".txt";
	text=NULL;
	symbol=NULL;
	symbol_number=0;
	error=0;
	warning=0;
}

sample::~sample()
{
	
}

bool sample::analyze_words_text()  //词法分析函数
{
	///////////////////////////////////////////////////
    const char *name;
	name=filename.data();
	ifstream file(name,ios::in);
	int work=0;  //控制循环
	if (file!=NULL)
	{
		system("cls");
		cout<<"\n--------------------Configuration: ";
     	cout<<filename<<" - Win32 Debug--------------------"<<endl;
        cout<<"Compiling..."<<endl;
        cout<<filename<<endl<<endl;
		word_chain *head=NULL;
		word_chain *word_point;//用于记录当前单词在单词链中的指针
		string words_line="";  //用于存储文中读取出来的一行字符
		int line=0;  //记录文件读取行数
		while (file.peek()!=EOF)
		{
			line++;
			getline(file,words_line);  //读取一行字符串,准备分析
			int length=words_line.length();  //记录取出的字符串的长度			
			for (int i=length-1;i>=0;i--)  //略去最后的空格符
			{
				if (words_line[i]!=32)
					break;
			}
			words_line=words_line.substr(0,i+1);
			length=words_line.length();  //记录经过处理后的字符串的长度
			int point=0; // 记录分离字符串单词时当前的位置
			string word; //从字符串中分离的单词
			int analyze_number=0; //分析结果数据存放
			while (point<length)
			{
				word=separate_word(words_line,point);  //分离单词  point有问题
				if (word.length())
			        analyze_number=analyze_word(word);//分析单词,带出分析结果
				int symbol_point=0;   //暂时用于记录标志符等在文中出现的位置
				switch(analyze_number)
				{
				case -1:
					error++;
					cout<<"ERROR "<<error<<": 非法字符(串) ("<<word<<") in line "<<line<<endl;				
					work=1;
					break;
				case -2:
					error++;
					cout<<"ERROR "<<error<<": 字符常数缺右边的单引号(') in line "<<line<<endl;
					cout<<"         tmissing (') behind ("<<word<<")"<<endl;
					work=1;
					break;
				case -3:
					error++;
					cout<<"ERROR "<<error<<": 注释部分缺右边的界符(*/) in line "<<line<<endl;
					cout<<"         missing (*/) behind ("<<word<<")"<<endl;
					work=1;
					break;
				case 36:
				case 37:
				case 38:
					symbol_point=point_word(word);  //暂时用于记录标志符等在文中出现的位置
					break;
				default:
					symbol_point=0;    //利用symbol_number区分非标志符值
				}
				if(!work)
				{
					if (analyze_number)   //单词链中不加进注释行
					{
						head=new word_chain;
				    	head->next=NULL;
				    	head->word=word;
				    	head->attribute=analyze_number;	
				    	if (!symbol_point)
						{
							if (analyze_number==36)
							{
								symbol_number++;
						    	symbol_point=symbol_number;
						    	head->order=symbol_point;
					        	word_point=add_word(head);
						    	add_symbol(word_point);
							}
							else
							{
								head->order=symbol_point;
					    		word_point=add_word(head);
							}
						}
						else
						{
							head->order=symbol_point;
							word_point=add_word(head);
						}
					}
				}
			}
		}
    	file.close();
    	if (!work)
		{
	    	cout<<endl<<filename<<" - "<<error<<" error(s), "<<warning<<" warning(s)"<<endl<<endl;
	    	cout<<filename<<" 分析结果如下:  "<<endl<<endl;
	    	return true;
		}
    	else
		{
	    	cout<<endl<<filename<<" - "<<error<<" error(s), "<<warning<<" warning(s)"<<endl<<endl;
	    	return false;
		}
	}
	else
	{
		cout<<"您要测试的文件不存在!按任何按键退出\n";
		return false;
	}
}

void sample::show_analyze_text()   //词法分析通过之后显示单词的二元式序列
{
	int i=1;
	word_chain *s=text;
	while (s!=NULL)
	{
		cout<<"(";
		if (s->attribute<10)
			cout<<" ";
		cout<<s->attribute<<",";
		if (!s->order)
			cout<<" -)";
		else
		{
			if (s->order<10)
			cout<<" ";
			cout<<s->order<<")";
		}
		if (i%5)
			cout<<"   ";
		else
			cout<<endl;
		i++;
		s=s->next;
	}
}

⌨️ 快捷键说明

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