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

📄 symbolentry.cpp

📁 compiler principle how to ananilyze
💻 CPP
字号:
// SymbolEntry.cpp: implementation of the SymbolEntry class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SymbolEntry.h"


const char* SymbolEntry::p_ARROW			= "->";
const char* SymbolEntry::p_EPSILON			= "epsilon";
const char* SymbolEntry::p_ALTER			= "|";
const char* SymbolEntry::p_DELIMITER		= ";";
const char* SymbolEntry::p_REVERSE_SLASH	= "\\";
const char* SymbolEntry::p_SINGLE_QUOTE		= "'";
const char* SymbolEntry::p_LEFT_BRACKET		= "[";
const char* SymbolEntry::p_RIGHT_BRACKET	= "]";


// token_type			token_kind						    lexeme
// -------------------------------------------------------------------------------------------
// VN					V: Non-terminal symbol					[A-Za-z][A-Za-z_0-9]*
// VT					V: terminal symbol						\'Escape\' | 'epsilon' 
//	Escape -> NoEscapeChar Escape | '\\\\' Escape | '\\\'' Escape | epsilon;
//	NoEscapeChar -> [^\'];

// GN					GT(GrammarTitle): GrammarName			[A-Za-z][A-Za-z_0-9]*

// ALTER				KEYWORD: meta-symbol					|		
// ARROW				KEYWORD: meta-symbol					->
// DELIMITER			KEYWORD: meta-symbol					;
// EPSILON				KEYWORD: meta-symbol					epsilon
// LEFT_BRACKET			KEYWORD: meta-symbol					[
// RIGHT_BRACKET		KEYWORD: meta-symbol					]
//--------------------------------------------------------------------------------------------

void SymbolEntry::setTokenType(int atoken_type) {

	token_type = atoken_type;

	switch(token_type) {

		case SymbolEntry::VN:
		case SymbolEntry::VT:
			token_kind = SymbolEntry::V;
			break;

		case SymbolEntry::GN:
			token_kind = SymbolEntry::GT;
			break;

		default:
			token_kind = SymbolEntry::KEYWORD;
			break;
		}
}

SymbolEntry::SymbolEntry(const string& alexeme, int atoken_type):
	lexeme(alexeme) {
	setTokenType(atoken_type);
}

bool SymbolEntry::operator !=(const SymbolEntry& se) const {

	return token_type != se.token_type ||
		   (lexeme.compare(se.lexeme) != 0);
}

// token_type			token_kind						    lexeme
// -------------------------------------------------------------------------------------------
// VN					V: Non-terminal symbol					[A-Za-z][A-Za-z_0-9]*
// VT					V: terminal symbol						\'Escape\' | 'epsilon'
//Escape -> NoEscapeChar Escape | '\\\\' Escape | '\\\'' Escape | epsilon;
//NoEscapeChar -> [^\'];

// GN					GT(GrammarTitle): GrammarName			[A-Za-z][A-Za-z_0-9]*

// ALTER				KEYWORD: meta-symbol					|		
// ARROW				KEYWORD: meta-symbol					->
// DELIMITER			KEYWORD: meta-symbol					;
// EPSILON				KEYWORD: meta-symbol					epsilon
// LEFT_BRACKET			KEYWORD: meta-symbol					[
// RIGHT_BRACKET		KEYWORD: meta-symbol					]
//--------------------------------------------------------------------------------------------

string SymbolEntry::display() const {

	switch(token_type) {
	case SymbolEntry::VN:
	case SymbolEntry::GN:
	case SymbolEntry::ALTER:
	case SymbolEntry::ARROW:
	case SymbolEntry::DELIMITER:
	case SymbolEntry::EPSILON:
	case SymbolEntry::LEFT_BRACKET:
	case SymbolEntry::RIGHT_BRACKET:
				
		return lexeme;
	
	case SymbolEntry::VT: {
		string str;
		str += SymbolEntry::c_SINGLE_QUOTE;

		int i= 0;
		int size = lexeme.size();
		for(; i< size; ++i) {
			if (lexeme[i] == SymbolEntry::c_SINGLE_QUOTE || 
				lexeme[i] == SymbolEntry::c_REVERSE_SLASH) 
				str += SymbolEntry::c_REVERSE_SLASH;

			str += lexeme[i];
		}
		str += SymbolEntry::c_SINGLE_QUOTE;
		return str;
	}

	default:
		error("SymbolEntry::display..unknown token_type :" + iToString(token_type));
		return "";

	}//switch

}

string SymbolEntry::toStr() const {
	
	string str = display();
	str += "\t";
	switch(token_type) {
	case SymbolEntry::VN:
		str += "VN: V";
		break;

	case SymbolEntry::VT:
		str += "VT: V";
		break;

	case SymbolEntry::GN:
		str += "GN: GT";
		break;

	case SymbolEntry::ALTER:
		str += "ALTER: KEYWORD";
		break;

	case SymbolEntry::ARROW:
		str += "ARROW: KEYWORD";
		break;

	case SymbolEntry::DELIMITER:
		str += "DELIMITER: KEYWORD";
		break;

	case SymbolEntry::EPSILON:
		str += "EPSILON: KEYWORD";
		break;

	case SymbolEntry::LEFT_BRACKET:
		str += "LEFT_BRACKET: KEYWORD";
		break;

	case SymbolEntry::RIGHT_BRACKET:
		str += "RIGHT_BRACKET: KEYWORD";
		break;
	}

	str += "\t";
	
	VLocationSet::const_iterator i = locations.begin();
	VLocationSet::const_iterator e = locations.end();
	for(; i != e; ++i) {
		str += (*i).toStr();
		if ((i + 1) != e)
			str += " ";
	}

	return str;

}

⌨️ 快捷键说明

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