添加的功能模块:
1、关键字和保留字部分:
const
NORW
=
19;
//添加 IFSYM,ELSESYM,FORSYM,TOSYM,DOWNTOSYM,RETURNSYM,
typedef enum
{
NUL, IDENT, NUMBER, PLUS, MINUS, TIMES,
GTR, GEQ,
PERIOD,
THENSYM,
CALLSYM,
PROGSYM,
RETURNSYM,
SLASH, ODDSYM, EQL, NEQ, LSS, LEQ,
LPAREN, RPAREN, COMMA, SEMICOLON,
BECOMES, BEGINSYM, ENDSYM, IFSYM,
WHILESYM, WRITESYM, READSYM, DOSYM,
CONSTSYM, VARSYM, PROCSYM,
ELSESYM,FORSYM,TOSYM, DOWNTOSYM,
PLUSE, MINUSE, DPLUS, DMINUS
} SYMBOL;
//添加 "ELSESYM", "FORSYM", "TOSYM", "DOWNTOSYM", "RETURNSYM",
//
"PLUSEQL", "MINUSEQL", "DOUBLEPLUS", "DOUBLEMINUS"
char *SYMOUT[] = {
"SLASH",
"NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES",
"ODDSYM", "EQL", "NEQ", "LSS",
"LEQ",
"COMMA",
"BEGINSYM",
"WHILESYM",
"DOSYM",
"GTR", "GEQ", "LPAREN", "RPAREN",
"SEMICOLON", "PERIOD", "BECOMES",
"ENDSYM", "IFSYM", "THENSYM",
"WRITESYM", "READSYM",
"CALLSYM","CONSTSYM","VARSYM","PROCSYM",
"PROGSYM",
"ELSESYM", "FORSYM", "TOSYM", "DOWNTOSYM", "RETURNSYM", "PLUSE",
"MINUSE","DPLUS",
"DMINUS"
};
2、词法处理部分(++,--,+=,-=,不等号)
void GetSym() {
int i,J,K;
ALFA
A;
while (CH<=' ') GetCh();
if (CH>='A' && CH<='Z') {
K=0;
do {
if (K
='A' && CH<='Z')||(CH>='0' && CH<='9'));
A[K]='\0';
strcpy(ID,A); i=1; J=NORW;
do {
K=(i+J) / 2;
if (strcmp(ID,KWORD[K])<=0) J=K-1;
if (strcmp(ID,KWORD[K])>=0) i=K+1;
}while(i<=J);
if (i-1 > J) SYM=WSYM[K];
else SYM=IDENT;
}
else
if (CH>='0' && CH<='9') {
K=0; NUM=0; SYM=NUMBER;
do {
NUM=10*NUM+(CH-'0');
K++; GetCh();
}while(CH>='0' && CH<='9');
if (K>NMAX) Error(30);
}
else
if (CH==':') {
GetCh();
if (CH=='=') { SYM=BECOMES; GetCh(); }
else SYM=NUL;
}
//+=,++,-=,--词法处理
else
if (CH=='+') {
GetCh();
if (CH=='=') { SYM=PLUSE; GetCh(); }
else
if (CH=='+') { SYM=DPLUS; GetCh(); }
else SYM=PLUS;
}
else
if (CH=='-') {
GetCh();
if (CH=='=') { SYM=MINUSE; GetCh(); }
else
if (CH=='-') { SYM=DMINUS; GetCh(); }
else SYM=MINUS;
}
//结束
else
if (CH=='<') {
GetCh();
if (CH=='=') { SYM=LEQ; GetCh(); }
//不等号<>处理
else
if (CH=='>') { SYM=NEQ;
else SYM=LSS;
//结束
}
else
if (CH=='>') {
GetCh();
if (CH=='=') { SYM=GEQ;
else SYM=GTR;
else { SYM=SSYM[CH]; GetCh(); }
GetCh(); }
GetCh(); }
}
}
、因子++、--处理
void FACTOR(SYMSET FSYS, int LEV, int &TX) {
int i;
TEST(FACBEGSYS,FSYS,24);
while (SymIn(SYM,FACBEGSYS)) {
if (SYM==IDENT) {
i=POSITION(ID,TX);
if (i==0) Error(11);
else
switch (TABLE[i].KIND) {
case CONSTANT: GetSym(); GEN(LIT,0,TABLE[i].VAL); break;
case VARIABLE:
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
//添加因子后++,后--处理
GetSym();
if (SYM==DPLUS){
//++
GetSym();
GEN(LIT,0,1);
GEN(OPR,0,2);
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
// 将 1 取入栈顶
//加操作
}else if(SYM==DMINUS){
GetSym();
GEN(LIT,0,1);
GEN(OPR,0,3);
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
// 将 1 取入栈顶
//减操作
}
//结束
break;
case PROCEDUR: GetSym(); Error(21); break;
}
}
else
if (SYM==NUMBER) {
if (NUM>AMAX) { Error(31); NUM=0; }
GEN(LIT,0,NUM); GetSym();
}
else
if (SYM==LPAREN) {
GetSym(); expression_r(SymSetAdd(RPAREN,FSYS),LEV,TX);
if (SYM==RPAREN) GetSym();
else Error(22);
}
//添加因子前++,前--处理
else
if (SYM==DPLUS){
GetSym();
if(SYM==IDENT){
i=POSITION(ID,TX);
if (i==0) Error(11);
else
if (TABLE[i].KIND!=VARIABLE) {
Error(12); i=0;
}
GetSym();
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LIT,0,1);
if (i!=0){
GEN(OPR,0,2);
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
//加操作
}
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}else Error(19);
}
else
if(SYM==DMINUS){
GetSym();
if(SYM==IDENT){
i=POSITION(ID,TX);
if (i==0) Error(11);
else
if (TABLE[i].KIND!=VARIABLE) {
Error(12); i=0;
}
GetSym();
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LIT,0,1);
if (i!=0){
GEN(OPR,0,3);
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
//减操作
}
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}else Error(19);
}
//结束
TEST(FSYS,FACBEGSYS,23);
}
}
4、语法处理部分(++,--,+=,-=,FOR,ELSE)
void STATEMENT(SYMSET FSYS,int LEV,int &TX) {
int i,CX1,CX2;
SYMBOL ADDOP;
switch (SYM) {
case IDENT:
i=POSITION(ID,TX);
if (i==0) Error(11);
else
if (TABLE[i].KIND!=VARIABLE) {
Error(12); i=0;
}
GetSym();
//后++,后--,-=,+-处理
if (SYM==BECOMES){
//=
GetSym();
expression_r(FSYS,LEV,TX);
if (i!=0){GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);} //将栈顶
//处理表达式
值存入变量
}
else if (SYM==DPLUS){
//++
// 将 1 取入栈顶
GetSym();
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LIT,0,1);
if (i!=0){
GEN(OPR,0,2);
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
//加操作
}
else if (SYM==DMINUS){
//--
GetSym();
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LIT,0,1);
if (i!=0){
GEN(OPR,0,3);
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
//减操作
}
else if (SYM==PLUSE){
//+=
GetSym();
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
expression_r(FSYS,LEV,TX);
if (i!=0){
GEN(OPR,0,2);
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
//加操作
}
else if (SYM==MINUSE){
//-=
GetSym();
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);