📄 编译原理.cpp
字号:
//pascal词法分析器 (turboc编)
#define VAR 1
#define INT 2
#define TEMP 3
#define UNKOWN 4
#define ID_OVERFLOW 1
#define NO_OVERFLOW 2
#define NOTEND 3
#define NO_PROGRAM 4
#define NO_PROGRAM_NAME 5
#define NO_SEMICOLON 6
#define NO_BEGIN 7
#define NO_END 8
#define NO_VAR 9
#define NO_INTEGER 10
#define NO_COLON 11
#define NO_ID 12
#define MULTIPLE_DECLEAR 13
#define NO_EVALUATE 14
#define NO_LEFT 15
#define NO_RIGHT 16
#define NO_ID_OR_PRINT 17
#define NO_SEMICOLON_OR_RIGHT 18
#define NO_SEMICOLON_OR_ADD_OR_SUB_OR_RIGHT 19
#define NOT_DECLEAR 20
#define WRONG_ID 21
#define NOT_DEFINED 22
#define PROGRAM -1
#define SPACE -2
#define EVALUATE 1
#define ADD 2
#define SUB 3
#define MUL 4
#define DIV 5
#define PRINT 6
#define END 7
int iAnyEorro=0;
int iRowCount;
int iTierCount;
char cLine[1024];
int iCurrentChar;
int iCharCount;
char *pWord[]={"and", "array", "begin", "bool", "call", "case", "char",
"constant", "do", "else", "end", "false", "for", "if",
"input", "integer", "not", "of", "or", "output", "procedure",
"program", "read", "real", "repeat", "set", "then", "to",
"true", "until", "var", "while", "write"};
const int iKeyWordCount=33;
//Definition of the Token and the SignTable
typedef struct
{
int iTypeCode;
int iAddress;
}Token;
typedef struct
{
CString strName;
int iAddress;
int iLength;
int iKind;
int iValue;
}SignTable;
typedef struct
{
int iCode;
int iAddressA;
int iAddressB;
int iAddressC;
}FourCode;
Token stcToken[512], stcNextToken;
int iCurrentToken=0;
int iTokenAmount;
SignTable stcSignTable[512], stcNextSignTable;
int iCurrentSignTable=0;
int iSignTableAmount;
char cSignList[1024];
int iCurrentSignList=0;
int iSignListAmount;
FourCode stcFourCode[512];
int iCurrentFourCode=0;
typedef struct
{
int iRow;
int iLine;
} WHERE;
WHERE stcWhere[512], stcWhereWrong;
//Declare function..
//Belong to the Scanner..
int Scanner(char *pSourceFileName);
char GetNextChar(void);
int Sort(char cChar);
int GetID(char cChar);
int IsKeyWord(CString strWord, int &iPosition);
int LookUpSignTable(CString strWord, int iTypeCode, int &iAddress);
int GetNumber(char cChar);
int HandleCom(void);
int GetDel(char cChar);
int FillToken(int iTypeCode, int iAddress);
//int FillFile(void);
int Scanner(char *pSourceFileName)
{
FILE *pSourceFile;
if((pSourceFile=fopen(pSourceFileName, "r"))==NULL)
{
printf("Open file error");
exit(1);
}
iRowCount=0;
char cFirstChar;
while((cFirstChar=fgetc(pSourceFile))!=EOF)
{
iCharCount=0;
iRowCount++;
while(cFirstChar!='\n')
{
cLine[iCharCount++]=cFirstChar;
cFirstChar=fgetc(pSourceFile);
}
cLine[iCharCount]=0;
iCurrentChar=0;
//gotoxy(iRowCount, 1);
printf("%s ", cLine);
while(iCurrentChar<iCharCount)
Sort(cLine[iCurrentChar]);
printf("\n");
}
fclose(pSourceFile);
//FillFile();
if(iAnyEorro) return 0;
else return 1;
}
//Function.GetNextChar
char GetNextChar(void)
{
return cLine[++iCurrentChar];
}
//Function.Sort
int Sort(char cChar)
{
int iType=0;
if(cChar>='a' && cChar<='z' || cChar>='A' && cChar<='Z') iType=1;//GetID(cChar);
if(cChar=='/') iType=3;//HandleCom();
if(cChar>='0' && cChar<='9') iType=2;//GetNumber(cChar);
switch(iType)
{
case 0:
GetDel(cChar);
break;
case 1:
GetID(cChar);
break;
case 2:
GetNumber(cChar);
break;
case 3:
HandleCom();
break;
}
iCurrentChar++;
//printf("{%d}", iCurrentChar);
return 1;
}
//Function.GetID
int GetID(char cChar)
{
CString strWord="";
strWord=strWord+cChar;
//printf("%c", cChar);
int iContinue=1;
int iCharLength=1;
while(iContinue)
{
char cNextChar=GetNextChar();
if(cNextChar>='a' && cNextChar<='z' || cNextChar>='A' && cNextChar<='Z'
|| cNextChar>='0' && cNextChar<='9')
{
iCharLength++;
strWord=strWord+cNextChar;
//printf("%c", cNextChar);
}
else
{
iContinue=0;
iCurrentChar--;
}
}
//if(cNextChar=='feihazifu') printf("Wrong");
int iTypeCode;
if(IsKeyWord(strWord, iTypeCode))
{
//printf("[KeyWord]");
FillToken(iTypeCode, -1);
}
else
{
if(iCharLength>8) PrintEorro(ID_OVERFLOW);
//printf("[ID]");
int iAddress;
LookUpSignTable(strWord, iTypeCode, iAddress);
FillToken(iTypeCode, iAddress);
}
// printf("\n");
return 1;
}
//Function.IsWrongChar
/*
int IsWrongChar(void)
{
return 1;
}
*/
//Function.IsWrongChar
int IsKeyWord(CString strWord, int &iPosition)
{
iPosition=1;
for(int i=0; i<iKeyWordCount; i++, iPosition++)
if(strWord==pWord[i]) return 1;
iPosition=iKeyWordCount+1;
return 0;
}
int LookUpSignTable(CString strWord, int iTypeCode, int &iAddress)
{
int iExistTheSameName=0;
int iWhereTheSameName;
for(int i=0; i<iCurrentSignTable; i++)
{
if(strWord==stcSignTable[i].strName)
{
iExistTheSameName=1;
iWhereTheSameName=i;
}
}
if(iTypeCode==34)
{
if(iExistTheSameName)
{
iAddress=iWhereTheSameName;
}
else
{
iAddress=iCurrentSignTable++;
stcSignTable[iAddress].iAddress=iCurrentSignList;//del
int iLimit=strWord.GetLength();
for(int i=0; i<iLimit; i++)
{
cSignList[iCurrentSignList++]=strWord.GetAt(i+1);
//printf("<%c, %d>", cSignList[iCurrentSignList-1], iCurrentSignList);
}
stcSignTable[iAddress].iLength=iLimit;
stcSignTable[iAddress].iKind=UNKOWN;//VAR;
stcSignTable[iAddress].iValue=-1;
stcSignTable[iAddress].strName=strWord;
}
}
if(iTypeCode==35)
{
if(iExistTheSameName)
{
iAddress=iWhereTheSameName;
}
else
{
iAddress=iCurrentSignTable++;
stcSignTable[iAddress].iAddress=-1; //del
stcSignTable[iAddress].iLength=-1;
stcSignTable[iAddress].iKind=INT;
int iNumber=0;
int iLimit=strWord.GetLength();
for(i=1; i<=iLimit; i++)
{
iNumber*=10;
iNumber+=strWord.GetAt(i)-'0';
}
stcSignTable[iAddress].iValue=iNumber;
stcSignTable[iAddress].strName=strWord;
}
}
return 1;
}
void DI(void)
{
int i;
printf("\nToken[%d]:", iCurrentToken);
for(i=0; i<iCurrentToken; i++)
printf("<%d,%d> ", stcToken[i].iTypeCode, stcToken[i].iAddress);
printf("\n");
/*
printf("\nList:");
puts(cSignList);
*/
printf("SignTable[%d]:", iCurrentSignTable);
for(i=0; i<iCurrentSignTable; i++)
{
char *p;
stcSignTable[i].strName.ToChars(&p);
printf("[%d:\"%s\"<%d,%d,%d,%d>] ", i, p, stcSignTable[i].iAddress,
stcSignTable[i].iLength, stcSignTable[i].iKind,
stcSignTable[i].iValue);
delete p;
}
printf("\n");
}
int GetNumber(char cChar)
{
CString strWord="";
strWord=strWord+cChar;
//printf("%c", cChar);
int iContinue=1;
while(iContinue)
{
char cNextChar=GetNextChar();
if(cNextChar>='0' && cNextChar<='9')
{
strWord=strWord+cNextChar;
//printf("%c", cNextChar);
}
else
{
iContinue=0;
iCurrentChar--;
}
}
// printf("\n");
//Change the strWord into Number
CString strNumber="";
int iDoing=0;
int iLimit=strWord.GetLength();
for(int i=0; i<iLimit; i++)
{
if(strWord.GetAt(i+1)!='0') iDoing=1;
if(iDoing) strNumber=strNumber+strWord.GetAt(i+1);
}
long lNumber=0;
iLimit=strNumber.GetLength();
for(i=1; i<=iLimit; i++)
{
lNumber*=10;
lNumber+=strNumber.GetAt(i)-'0';
}
if(lNumber>32767 || iLimit>5) PrintEorro(NO_OVERFLOW);//printf("=Eorro:over flow!\n");
else
{
int iAddress;
LookUpSignTable(strNumber, 35, iAddress);
FillToken(35, iAddress);
}
return 1;
}
int HandleCom(void)
{
char cNextChar=GetNextChar();
if(cNextChar!='*')
{
iCurrentChar--;
FillToken(48, -1);
}
else
{
int iEorro=1;
if(iCharCount-iCurrentChar>2)
{
cNextChar=GetNextChar();
while(iCurrentChar<iCharCount-1)
{
char cCurrentChar=cNextChar;
cNextChar=GetNextChar();
if(cCurrentChar=='*' && cNextChar=='/')
{
iEorro=0;
break;
}
}
if(iEorro) PrintEorro(NOTEND);//printf("+Eorro:not over+");
}
}
return 1;
}
int GetDel(char cChar)
{
switch(cChar)
{
case '+':
FillToken(43, -1);
break;
case '-':
FillToken(45, -1);
break;
case '*':
FillToken(41, -1);
break;
case '(':
FillToken(39, -1);
break;
case ')':
FillToken(40, -1);
break;
case ',':
FillToken(44, -1);
break;
case ';':
FillToken(52, -1);
break;
case ' ':
while(GetNextChar()==' ');
iCurrentChar--;
break;
case '\t':
while(GetNextChar()=='\t');
iCurrentChar--;
break;
case ':':
char cNextChar=GetNextChar();
if(cNextChar=='=') FillToken(51, -1);
else
{
iCurrentChar--;
FillToken(50, -1);
}
break;
case '<':
cNextChar=GetNextChar();
if(cNextChar=='<') FillToken(61, -1);
else
{
iCurrentChar--;
FillToken(100, -1);
}
break;
default:
FillToken(100, -1);
}
return 1;
}
int FillToken(int iTypeCode, int iAddress)
{
stcWhere[iCurrentToken].iRow=iRowCount;
stcWhere[iCurrentToken].iLine=iCurrentChar+1;
stcToken[iCurrentToken].iTypeCode=iTypeCode;
stcToken[iCurrentToken++].iAddress=iAddress;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -