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

📄 recognize_0011.cpp

📁 词法分析器 用c或c++描述toyl语言词法分析器
💻 CPP
字号:
// Recognize_Token.cpp: implementation of the Recognize_Token class.
//
//////////////////////////////////////////////////////////////////////

#include "Recognize_Token.h"
#include <string.h>
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Recognize_Token::Recognize_Token(char strinFile[20],char stroutFile[20])
{
	point = -1;
	int i=0;
	p_type = 0;
	for(int j=0;j<100;j++)
	{
		Tokens[j].CLASS = 0;
		strcpy(Tokens[j].SEMAN,"init");
	}
	/*
	fstream inFile;
	inFile.open(strinFile,ios::in);
	if(!inFile)
	{
		cout<<"File can't open.\n";
		abort();
	}

	char ch;
	while(inFile.get(ch))
	{
		str_token[i++]=ch;
	}t
	str_token[i]='\0';
	cout<<str_token;
	inFile.close();
	*/
	cout<<"input source:"<<endl;
	i=0;
	char c;
	c = getchar( );
	while(c!='#')
	{
		str_token[i++] = c;
		c = getchar( );
	}
	str_token[i] = '\0';
	while(str_token[point] != '\0')
	{
		next_token( );
	}

	print_token(stroutFile);
/*
	while(str_token[point] != '\0')
	{
		char ch = next_avail_char();
		cout<<ch;
	}
*/
}

Recognize_Token::~Recognize_Token()
{

}
void Recognize_Token::print_token(char stroutFile[20])
{
	/*
	fstream  outFile;
	outFile.open(stroutFile,ios::out);

	if(!outFile)
	{
	cout<<stroutFile<<"can't open.\n";
	abort();
	}
	
	for(int i=0;i<p_type;i++)
	{
		outFile<<Tokens[i].CLASS<<"   "<<Tokens[i].SEMAN<<endl;
	}
	*/
	for(int i=0;i<p_type;i++)
	{
		cout<<Tokens[i].CLASS<<"    "<<Tokens[i].SEMAN<<endl;
	}
	//outFile.close();
}

void  Recognize_Token::next_token( )
{
	char ch = next_avail_char();
	
	if(ch>='0' && ch<='9')
			recognize_number(ch);

	else if((ch>='a' && ch<='z') || (ch>= 'A' && ch<= 'Z'))
			recognize_name(ch) ;
	
	else if(ch == '+')
	{
			Tokens[p_type].CLASS =PLUS;
			strcpy(Tokens[p_type].SEMAN ,"加号");
			p_type++;
	}
	else if(ch == '*')
	{
			Tokens[p_type].CLASS =MULT;
			strcpy(Tokens[p_type].SEMAN ,"乘号");
			p_type++;
	}
	else if(ch == ':')
	{
		next_char( );
		if(str_token[point] != '=')
			error(1);
		else
			Tokens[p_type].CLASS =ASS;
			strcpy(Tokens[p_type].SEMAN ,"赋值号");
			p_type++;
	}
	else if(ch == ';')
	{
		Tokens[p_type].CLASS =SEMI;
		strcpy(Tokens[p_type].SEMAN ,"分号");
		p_type++;
	}
	else if(ch == '(')
	{
		Tokens[p_type].CLASS =OPEN;
		strcpy(Tokens[p_type].SEMAN ,"左括号");
		p_type++;
	}
	else if(ch == ')')
	{
		Tokens[p_type].CLASS =CLOSE;
		strcpy(Tokens[p_type].SEMAN ,"右括号");
		p_type++;
	}
	else if(ch == '\0')
	{
		Tokens[p_type].CLASS =TEOF;
		strcpy(Tokens[p_type].SEMAN ,"结束号");
		p_type++;
	}
	else
		error(0);
}

void Recognize_Token::next_char( )
{
	point ++;
}
char Recognize_Token::next_avail_char( )
{
	point++;
	while(str_token[point] == ' ' || str_token[point] == '\n')
	{
		point ++;
	}
	return str_token[point];
}
void Recognize_Token::back()
{
	point--;
}
void Recognize_Token::recognize_number(char ch)
{
	int N=0;
	//不成功
	/*
	while(is_digit(str_token[point]))
	{
		N = N*10+(ch-'0');
		next_char();
	}
	Tokens[p_type++].CLASS =NUMB;
	strcpy(Tokens[p_type].SEMAN ,N);
	*/
	char name[20];
	int np=0;
	while(is_digit(str_token[point]))
	{
		name[np++] = str_token[point];
		next_char( );
	}
	name[np] = '\0';

	Tokens[p_type].CLASS =NUMB;
	strcpy(Tokens[p_type].SEMAN ,name);
	p_type++;
	back();
}
void Recognize_Token::recognize_name(char ch)
{
	char name[20];
	int np=0;
	name[np++] = ch;
	next_char();

	while((is_digit(str_token[point])) || (is_letter(str_token[point])))
	{
		name[np++] = str_token[point];
		next_char();
	}
	name[np] = '\0';
	
	int num_name;
	if(!strcmp(name,"begin"))
		num_name = 1;
	else if(!strcmp(name,"end"))
		num_name = 2;
	else if(!strcmp(name,"read"))
		num_name = 3;
	else if(!strcmp(name,"write"))
		num_name = 4;
	else 
		num_name = 5;
	switch(num_name)
	{
	case 1  :
		Tokens[p_type].CLASS = BEGIN ;
		strcpy(Tokens[p_type].SEMAN ,"begin");
		p_type++;
		break;
	case 2  :
		Tokens[p_type].CLASS = END;
		strcpy(Tokens[p_type].SEMAN , "end");
		p_type++;
		break;
	case 3 :
		Tokens[p_type].CLASS = READ;
		strcpy(Tokens[p_type].SEMAN , "read");
		p_type++;
		break;
	case 4 :
		Tokens[p_type].CLASS = WRITE;
		strcpy(Tokens[p_type].SEMAN , "write");
		p_type++;
		break;
	default   :
		Tokens[p_type].CLASS = IDEN;
		strcpy(Tokens[p_type].SEMAN , name);
		p_type++;
		break;
	}
	back( );
}
bool Recognize_Token::is_digit(char ch)
{
	return (ch>='0' && ch<='9');
}
bool Recognize_Token::is_letter(char ch)
{
	return ((ch>='a' && ch<='z') || (ch>= 'A' && ch<= 'Z'));
}
void Recognize_Token::error(int mark)
{
	if(mark == 0)
		cout<<"输入了非法字符!";
	else if(mark == 1)
		cout<<"赋值符号错误!";
}

⌨️ 快捷键说明

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