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

📄 pascalanalyzer.cpp

📁 C++ mfc 源代码
💻 CPP
字号:
// PascalAnalyzer.cpp: implementation of the CPascalLexAnalyzer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "zscpascal.h"
#include "PascalAnalyzer.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CPascalLexAnalyzer::CPascalLexAnalyzer(CString &str) : CStringTokenizer(str)
{
	m_bPushedBack = FALSE;
	m_Keywords.InitHashTable(MAX_KW);
	LowerCaseMode(TRUE);
	InsertKeyword(CString("program"),TT_KW_PROGRAM);
	InsertKeyword(CString("read"),TT_KW_READ);
	InsertKeyword(CString("const"),TT_KW_CONST);
	InsertKeyword(CString("var"),TT_KW_VAR);
	InsertKeyword(CString("begin"),TT_KW_BEGIN);
	InsertKeyword(CString("end"),TT_KW_END);
	InsertKeyword(CString("for"),TT_KW_FOR);
	InsertKeyword(CString("to"),TT_KW_TO);
	InsertKeyword(CString("downto"),TT_KW_DOWNTO);
	InsertKeyword(CString("do"),TT_KW_DO);
	InsertKeyword(CString("procedure"),TT_KW_PROCEDURE);
	InsertKeyword(CString("function"),TT_KW_FUNCTION);
	InsertKeyword(CString("integer"),TT_KW_INTEGER);
	InsertKeyword(CString("real"),TT_KW_REAL);
	InsertKeyword(CString("char"),TT_KW_CHAR);
	InsertKeyword(CString("array"),TT_KW_ARRAY);
	InsertKeyword(CString("record"),TT_KW_RECORD);
	InsertKeyword(CString("of"),TT_KW_OF);
	InsertKeyword(CString("mod"),TT_KW_MOD);
	InsertKeyword(CString("div"),TT_KW_DIV);
	InsertKeyword(CString("while"),TT_KW_WHILE);
	InsertKeyword(CString("repeat"),TT_KW_REPEAT);
	InsertKeyword(CString("case"),TT_KW_CASE);
	InsertKeyword(CString("print"),TT_KW_PRINT);
	InsertKeyword(CString("if"),TT_KW_IF);
	InsertKeyword(CString("not"),TT_KW_NOT);
	InsertKeyword(CString("and"),TT_KW_AND);
	InsertKeyword(CString("or"),TT_KW_OR);
	InsertKeyword(CString("until"),TT_KW_UNTIL);
	InsertKeyword(CString("then"),TT_KW_THEN);
	InsertKeyword(CString("else"),TT_KW_ELSE);
	InsertKeyword(CString("step"),TT_KW_STEP);
	InsertKeyword(CString("otherwise"),TT_KW_OTHERWISE);
}

CPascalLexAnalyzer::~CPascalLexAnalyzer()
{

}

void CPascalLexAnalyzer::InsertKeyword(CString &str, int code)
{
	m_Keywords[str] = code;
}

int CPascalLexAnalyzer::NextToken()
{
	if (m_bPushedBack)
	{
		m_bPushedBack = FALSE;
		return m_tType;
	}
	int code;
	int val = CStringTokenizer::NextToken ();
	if (val == TT_WORD && m_Keywords.Lookup(m_sVal,code))
		return m_tType = code;

	if (val == '<')
		if (CStringTokenizer::NextToken () == '=')
			return m_tType = TT_LWE;
		else
		{
			CStringTokenizer::PushBack();
			if (CStringTokenizer::NextToken () == '>')
				return m_tType = TT_NE;
			else
			{
				CStringTokenizer::PushBack();
				return m_tType =val;
			}
		}
	if (val == '>')
		if (CStringTokenizer::NextToken () == '=')
			return m_tType = TT_GTE;
		else
		{
			CStringTokenizer::PushBack();
			return m_tType =val;
		}
	if (val == ':')
		if (CStringTokenizer::NextToken () == '=')
			return m_tType =TT_IS;
		else
			CStringTokenizer::PushBack();
	return m_tType =val;
}

CString CPascalLexAnalyzer::GetStrValue()
{
	CString ret;
	switch (m_tType)
	{
	case TT_EOF:
		ret = "EOF";
		break;
	case TT_EOL:
		ret = "EOL";
		break;
	case TT_WORD:
		ret = m_sVal;
		break;
	case TT_KEYWORD:
		ret = m_sVal;
		break;
	case TT_LWE:
		ret = "<=";
		break;
	case TT_GTE:
		ret = ">=";
		break;
	case TT_IS:
		ret = ":=";
		break;
	case TT_NE:
		ret = "<>";
		break;
	case TT_STRING:
		ret = m_sVal;
		break;
	case TT_INTEGER:
	case TT_REAL:
		ret.Format("%f",m_dVal);
		break;
	default:
		ret.Format ( "\'%c\'",(char) m_tType) ;
	}
	return ret;
}


void CPascalLexAnalyzer::PushBack()
{
	m_bPushedBack = TRUE;
}

⌨️ 快捷键说明

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