📄 pascalanalyzer.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 + -