📄 compiler.cpp
字号:
// Compiler.cpp: implementation of the CCompiler class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "mini_Pascal.h"
#include "Mini_PascalDoc.h"
#include "Compiler.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCompiler::CCompiler()
{
CurType = INTEGER;
Nonlicetwordnum = 0;
NXQ = 1;
m_bool.FC = -1;
m_bool.TC = -1;
IDAssginPosition = -1;
IDAssgin = "";
m_error = 0 ;
m_sSourceStr = "" ;
m_DualityModel.LineNo = 0 ;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = -1;
m_eErrorTable.clear();
tempnum = 0;
CurStep = -1;
CurLine = 1;
m_QuadRuple.OP = 0;
m_QuadRuple.arg1 = 0;
m_QuadRuple.arg2 = 0;
m_QuadRuple.result = 0;
m_fourModel.push_back(m_QuadRuple);
}
CCompiler::~CCompiler()
{
}
void CCompiler::SetSourceStr(CString str)
{
m_sSourceStr = str;
m_sSourceStr += '#';
}
int CCompiler::LookUp(CString str)
{
int flag = -1 ;
for ( int i = 0 ; i < 11 ; i ++ )
{
if ( str.CompareNoCase( my_KeyWords [ i ].KeyWord ) ==0 )
{
flag = i ;
break;
}
}
return flag;
}
void CCompiler::CiFa()
{
int length = m_sSourceStr.GetLength();
int pointnum=0;//小数点数目
int Line = 1 ;
Initiate_Keywords_Table();
char ch ;
int c,j = 0 ,i = 0;
while( j < length )
{
CString TOKEN('\0',20);
ch = m_sSourceStr[ j++ ];
if (isalpha( ch ))
{
TOKEN.SetAt( 0 , ch );
ch = m_sSourceStr[ j++ ] ;
i = 1;
while ( isalpha( ch )||isdigit( ch ))
{
TOKEN.SetAt( i , ch );
i ++;
ch = m_sSourceStr[ j++ ];
}
j --;
c = LookUp(TOKEN);
if ( c != -1 )
{//识别到保留字
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = c;
m_dModel.push_back(m_DualityModel);
}
else
{
//识别到标识符
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = TOKEN;
m_DualityModel.TokenType = ID;
m_dModel.push_back(m_DualityModel);
}
}
else if (isdigit( ch )||ch=='.')
{
TOKEN.SetAt( i , ch );
if (ch=='.') pointnum++;//识别的是实数
CString num = "";
num+=ch;
ch = m_sSourceStr[ j++ ] ;
i = 1 ;
while ( isdigit ( ch )||ch=='.' )
{
if( ch=='.')pointnum++;
TOKEN.SetAt( i , ch ) ;
num+=ch;
i ++ ;
ch = m_sSourceStr[ j++ ];
}
j --;
//识别到数字
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = num;
if(pointnum == 0) m_DualityModel.TokenType = INTNUM;
if(pointnum == 1) m_DualityModel.TokenType = REALNUM;
if(pointnum > 1) {
Nonlicetwords.push_back(num);
Nonlicetwordnum ++;
Error(Nonlicetwordnum - 1, Nonlicetword, Line);
}
else m_dModel.push_back(m_DualityModel);
pointnum = 0;
}
else
switch( ch )
{
case '<':
ch = m_sSourceStr[ j++ ];
if ( ch == '=')
{
//识别到<=
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = LE ;
m_dModel.push_back(m_DualityModel);
}
else if (ch == '>' )
{
//识别到<>
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = NE ;
m_dModel.push_back(m_DualityModel);
}
else
{
j -- ;
//识别到<
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = LT ;
m_dModel.push_back(m_DualityModel);
}
break ;
case '=':
////识别到=
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = EQ ;
m_dModel.push_back(m_DualityModel);
break ;
case ':' :
ch = m_sSourceStr[ j++ ];
if(ch!='=')
{
//识别到:
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = COLON ;
m_dModel.push_back(m_DualityModel);
j--;//回退一个字符
}
else
{
//识别到:=赋值语句
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = ASSIGN ;
m_dModel.push_back(m_DualityModel);
}
break;
case ' ' ://空格
break;
case '#' ://结束符
break;
case '>':
ch = m_sSourceStr[ j++ ];
if ( ch == '=' )
{
//识别到>=
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = GE ;
m_dModel.push_back(m_DualityModel);
}
else
{
j --;
//识别到>
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = GT ;
m_dModel.push_back(m_DualityModel);
}
break;
case 13:
Line ++ ;
break;
case 10:
break;
case 9:
break;
case ';':
//识别到;
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = SEMI ;
m_dModel.push_back(m_DualityModel);
break;
case '+':
//识别到+
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = PLUS ;
m_dModel.push_back(m_DualityModel);
break;
case '-':
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = SUB ;
m_dModel.push_back(m_DualityModel);
//识别到-
break;
case '*':
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = TIMES ;
m_dModel.push_back(m_DualityModel);
//识别到*
break;
case ',':
//识别到,
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = COMMA ;
m_dModel.push_back(m_DualityModel);
break;
case '(':
//识别到(
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = LPAREN ;
m_dModel.push_back(m_DualityModel);
break;
case ')':
//识别到)
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = RPAREN ;
m_dModel.push_back(m_DualityModel);
break;
case '!':
//识别到!
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = NOT ;
m_dModel.push_back(m_DualityModel);
break;
case '&':
//识别到&
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = AND ;
m_dModel.push_back(m_DualityModel);
break;
case '|':
//识别到|
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = OR ;
m_dModel.push_back(m_DualityModel);
break;
case '{':
//识别到{
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = LCUT ;
m_dModel.push_back(m_DualityModel);
break;
case '}':
//识别到}
m_DualityModel.LineNo = Line;
m_DualityModel.TokenString = "";
m_DualityModel.TokenType = RCUT ;
m_dModel.push_back(m_DualityModel);
break;
default :
Error(j, Nonlicetchar, Line);
//出现非法字符
break ;
}//switch
}
}
void CCompiler::Initiate_Keywords_Table()
{
my_KeyWords [ 0 ].KeyWord = "program";
my_KeyWords [ 1 ].KeyWord = "begin";
my_KeyWords [ 2 ].KeyWord = "end";
my_KeyWords [ 3 ].KeyWord = "var";
my_KeyWords [ 4 ].KeyWord = "if";
my_KeyWords [ 5 ].KeyWord = "then";
my_KeyWords [ 6 ].KeyWord = "else";
my_KeyWords [ 7 ].KeyWord = "while";
my_KeyWords [ 8 ].KeyWord = "do";
my_KeyWords [ 9 ].KeyWord = "integer";
my_KeyWords [ 10 ].KeyWord = "real";
}
void CCompiler::Error(int position, int errortype, int line)
{
if(errortype<=2) m_error = 1; //词法错误
else m_error = 2; //语法错误
error.Position = position;
error.ErrorType = errortype;
error.OccurLine = line;
m_eErrorTable.push_back(error);
}
void CCompiler::YuFa()
{
Advance();
MPROGRAM();
//若词法分析无误,进行语法分析
}
void CCompiler::MPROGRAM()
{
int TokenType = m_dModel[ CurStep ].TokenType;
Match(PROGRAM);//匹配program
Advance();
Match(COLON);
Advance();
Match(LPAREN);
Advance();
Match(ID);
Advance();
Match(RPAREN);
Advance();
VARS();
Match(BEGIN);
Advance();
STL();
Match(END);
if(CurStep < m_dModel.size()-1){//end后仍有单词
Error(CurStep, ExtraWordAfterEnd, CurLine);
}
return;
}
void CCompiler::VARS()
{
Match(VAR);
Advance();
VARST();
}
void CCompiler::VARST()
{
if(Is(ID)) {
m_Variable.push_back(CurToken);
Advance();
while(Is(COMMA)){//匹配逗号
Advance();
if(Is(ID)) {
m_Variable.push_back(CurToken);
Advance();
}
else{
if(Is(INTEGER)||Is(REAL)){
Error(CurStep, COLONMiss, CurLine);
}
else{
Error(CurStep, IDExcept, CurLine);
}
}
}
Match(COLON);//匹配冒号
Advance();
TYPE();
Match(SEMI);//匹配分号
Advance();
return;
}
// else
}
void CCompiler::TYPE()
{
if(Is(INTEGER)){
FillSymbolRecord(INTEGER);
CurType = INTEGER;
Advance();
return;
}
if(Is(REAL)){
FillSymbolRecord(REAL);
CurType = REAL;
Advance();
return;
}
//出错未匹配类型
Error(CurStep, LeadTypeExcept, CurLine);
}
Statement CCompiler::STL()
{
Statement STL;
Statement m_S;
STL.Chain = 0;
while(Is(IF)||Is(WHILE)||Is(ID)){//是语句的开始
m_S = S();
int p = m_S.Chain;
if( Is(SEMI) ){//匹配;说明是语句序列
Advance();
if(Is(ELSE)){
Error(CurStep, ExtraSEMI, CurStep);//多了分号
}
else{
BackPatch(m_S.Chain, NXQ);
int p1 = m_S.Chain;
int a ;
a = 0;
STL.Chain = NXQ;
}
}
else{
if(Is(IF)||Is(WHILE)||Is(LCUT)||Is(ID)){
Error(CurStep, SEMIMiss, CurStep);//少了分号
}
}
}
int pi = STL.Chain;
return STL;
}
void CCompiler::Advance()
{
CurStep++ ;
}
BOOL CCompiler::Match(int type)
{
CurLine = m_dModel[ CurStep ].LineNo;
if(m_dModel[ CurStep ].TokenType == type){
CurToken = m_dModel[ CurStep ].TokenString;
return TRUE;
}
switch(type){
case PROGRAM:
Error(CurStep, ProgramExpect, CurLine);
Backward();
break;
case BEGIN:
Error(CurStep, BeginExpect, CurLine);
Backward();
break;
case END:
Error(CurStep, EndExpect, CurLine);
Backward();
break;
case VAR:
Error(CurStep, VarExcept, CurLine);
Backward();
break;
case INTEGER:
Error(CurStep, LeadTypeExcept, CurLine);
Backward();
break;
case REAL:
Error(CurStep, LeadTypeExcept, CurLine);
Backward();
break;
case ID:
Error(CurStep, IDExcept, CurLine);
Backward();
break;
case COMMA:
Error(CurStep, COMMAExcept, CurLine);
Backward();
break;
case SEMI:
Error(CurStep, SEMIExcept, CurLine);
Backward();
break;
case COLON:
Error(CurStep, COLONExcept, CurLine);
Backward();
break;
case ASSIGN:
Error(CurStep, ASSIGNExcept, CurLine);
Backward();
break;
case RPAREN:
Error(CurStep, RPARENExcept, CurLine);
Backward();
break;
case LPAREN:
Error(CurStep, LPARENExcept, CurLine);
Backward();
break;
default:
break;
}
return FALSE;
}
Statement CCompiler::S()
{
Statement DefaultS;
DefaultS.Chain = 0;
int TokenType = m_dModel[ CurStep ].TokenType;
switch(TokenType){
case ID://赋值语句
{
IDAssgin = m_dModel[ CurStep ].TokenString;
if (VariableLegal(IDAssgin, -1)==0){
//未定义的变量
Error(CurStep, UndeclaredId, CurLine);
SkipToSEMI();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -