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

📄 cppdyer.cpp

📁 这是一个很不错的词法语法分析器! 很适合计算机专业的大学生学习参考
💻 CPP
字号:
// CppDyer.cpp: implementation of the CppDyer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include <windows.h>
#include "CppDyer.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

static const int MAX_BUFFER_SIZE=32*1024;

using namespace std;
using namespace CppParser;

void CppDyer::getBaseSettings(string iniFileName)
{
	string tagNames[]={"GLOBAL","PPKEYWORD","KEYWORD","IDENTIFIER","WHITESPACE","LINEFEED","DELIMITER","OPERATOR",
		"SINGLELINECOMMENT","STRINGLITERAL","CHARLITERAL","DECNUMBERLITERAL","HEXNUMBERLITERAL","OCTNUMBERLITERAL",
		"FLOATNUMBERLITERAL","BLOCKCOMMENT"};
	int tagIDs[]={INVALID,PPKEYWORD,KEYWORD,IDENTIFIER,WHITESPACE,LINEFEED,DELIMITER,OPERATOR,
		SINGLELINECOMMENT,STRINGLITERAL,CHARLITERAL,DECNUMBERLITERAL,HEXNUMBERLITERAL,OCTNUMBERLITERAL,
		FLOATNUMBERLITERAL,BLOCKCOMMENT};
	char s[MAX_BUFFER_SIZE];
	for(int i=0;i<sizeof(tagIDs)/sizeof(*tagIDs);++i)
	{
		if(GetPrivateProfileString("settings",(tagNames[i]+"_prefix").c_str(),"",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
		{
			if(s[0])
			{
				mPrefix[tagIDs[i]]=s;
			}
		}
		if(GetPrivateProfileString("settings",(tagNames[i]+"_suffix").c_str(),"",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
		{
			if(s[0])
			{
				mSuffix[tagIDs[i]]=s;
			}
		}
	}
	if(GetPrivateProfileString("settings","line_number_chars","0",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
	{
		mLineNumberChars=atoi(s);
		if(mLineNumberChars<0)
			mLineNumberChars=0;
	}
	if(GetPrivateProfileString("settings","line_number_indent","8",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
	{
		mLineNumberIndent=atoi(s);
		if(mLineNumberIndent<mLineNumberChars)
		{
			mLineNumberChars=mLineNumberChars+4;
		}
	}
	if(GetPrivateProfileString("settings","line_number_prefix","",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
	{
		mLineNumberPrefix=s;
	}
	if(GetPrivateProfileString("settings","line_number_suffix","",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
	{
		mLineNumberSuffix=s;
	}
	if(GetPrivateProfileString("settings","tab_spaces","4",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
	{
		mTabSpaces=atoi(s);
		if(mTabSpaces<1)
			mTabSpaces=1;
	}
	if(GetPrivateProfileSection("extra_keyword",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
	{
		char* p=s;
		while(p[0])
		{
			mExtraKeywords.insert(p);
			p+=strlen(p)+1;
		}
	}
}

void CppDyer::getSpecialSettings(string iniFileName)
{
	char s[MAX_BUFFER_SIZE];
	GetPrivateProfileSectionNames(s,MAX_BUFFER_SIZE,iniFileName.c_str());
	char* p=s;
	while(p[0])
	{
		if(strnicmp(p,"special_identifier_",sizeof("special_identifier_")-1)==0)
		{
			char prefix[MAX_BUFFER_SIZE];
			char suffix[MAX_BUFFER_SIZE];
			char value[MAX_BUFFER_SIZE];
			GetPrivateProfileString(p,"style_prefix","",prefix,MAX_BUFFER_SIZE,iniFileName.c_str());
			GetPrivateProfileString(p,"style_suffix","",suffix,MAX_BUFFER_SIZE,iniFileName.c_str());
			if(prefix[0]||suffix[0])
			{
				mSpecialIdentifierPrefix.push_back(prefix);
				mSpecialIdentifierSuffix.push_back(suffix);
				if(GetPrivateProfileSection(p,value,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
				{
					char* v=value;
					while(v[0])
					{
						mSpecialIdentifiers[v]=mSpecialIdentifierPrefix.size()-1;
						v+=strlen(v)+1;
					}
				}
			}
		}
		p+=strlen(p)+1;
	}
}

CppDyer::CppDyer(string iniFileName)
{
	vector<char> fullPath(10240);
	char* temp;
	if(GetFullPathName(iniFileName.c_str(),fullPath.size(),&fullPath[0],&temp)>=fullPath.size())
	{
		fullPath.resize(GetFullPathName(iniFileName.c_str(),fullPath.size(),&fullPath[0],&temp)+1);
		if(GetFullPathName(iniFileName.c_str(),fullPath.size(),&fullPath[0],&temp)>=fullPath.size())
			throw 1;
	}
	if(GetFileAttributes(&fullPath[0])==0xffffffff)
		throw 1;
	getBaseSettings(&fullPath[0]);
	getSpecialSettings(&fullPath[0]);
}

void CppDyer::processFile(string cppFileName)
{
	mPositionInLine=0;
	mLineNumber=0;
	mConvertingText.resize(1024*1024);
	mConvertingText=mPrefix[INVALID];
	if(mLineNumberChars)
	{
		char s[64];
		sprintf(s,"%d",mLineNumber);
		mConvertingText+=mLineNumberPrefix;
		if(strlen(s)<mLineNumberChars)
		{
			for(string::size_type i=0;i<mLineNumberChars-strlen(s);++i)
			{
				mConvertingText+='0';
			}
		}
		mConvertingText+=s;
		for(string::size_type i=mLineNumberChars;i<mLineNumberIndent;++i)
		{
			mConvertingText+="&nbsp;";
		}
		mConvertingText+=mLineNumberSuffix;
	}
	mPositionInLine=0;
	++mLineNumber;
	ifstream ifs(cppFileName.c_str());
	StreamContextHelper::InputStreamHelper helper(ifs);
	StreamContextHelper(helper,*this).run();
	mConvertingText+=mSuffix[INVALID];
	ofstream ofs((cppFileName+".htm").c_str());
	ofs<<mConvertingText;
}

void CppDyer::parse(Type t,const string& s,const Context&)
{
	string prefix,suffix;
	if(t==IDENTIFIER&&mExtraKeywords.find(s)!=mExtraKeywords.end())
	{
		prefix=mPrefix[KEYWORD];
		suffix=mSuffix[KEYWORD];
	}
	else if(t==IDENTIFIER&&mSpecialIdentifiers.find(s)!=mSpecialIdentifiers.end())
	{
		prefix=mSpecialIdentifierPrefix[mSpecialIdentifiers[s]];
		suffix=mSpecialIdentifierSuffix[mSpecialIdentifiers[s]];
	}
	else
	{
		prefix=mPrefix[t];
		suffix=mSuffix[t];
	}
	mConvertingText+=prefix;
	for(string::size_type i=0;i<s.size();++i)
	{
		if(s[i]=='\"')
			mConvertingText+="&quot;";
		else if(s[i]=='&')
			mConvertingText+="&amp;";
		else if(s[i]=='<')
			mConvertingText+="&lt;";
		else if(s[i]=='>')
			mConvertingText+="&gt;";
		else if(s[i]==' ')
			mConvertingText+="&nbsp;";
		else if(s[i]=='\t')
		{
			for(int i=0;i<mTabSpaces-mPositionInLine%4;++i)
				mConvertingText+="&nbsp;";
			mPositionInLine+=mTabSpaces-mPositionInLine%4;
			continue;
		}
		else if(s[i]=='\n')
		{
			mConvertingText+="<br>\n";
			if(mLineNumberChars)
			{
				mConvertingText+=suffix;
				mConvertingText+=mLineNumberPrefix;
				char s[64];
				sprintf(s,"%d",mLineNumber);
				if(strlen(s)<mLineNumberChars)
				{
					for(string::size_type i=0;i<mLineNumberChars-strlen(s);++i)
					{
						mConvertingText+='0';
					}
				}
				mConvertingText+=s;
				for(string::size_type i=mLineNumberChars;i<mLineNumberIndent;++i)
				{
					mConvertingText+="&nbsp;";
				}
			}
			mPositionInLine=0;
			mConvertingText+=mLineNumberSuffix;
			mConvertingText+=prefix;
			++mLineNumber;
			continue;
		}
		else
			mConvertingText+=s[i];
		++mPositionInLine;
	}
	mConvertingText+=suffix;
}

CppDyer::~CppDyer()
{

}

⌨️ 快捷键说明

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