📄 stmt.c
字号:
/***************************************
By BHU 35060122 Peng Hui;
2008.02
description:
A small compiler to translate a C program to 80X80 Assembly Code
***************************************/
#include"Global.h"
void CompStmt() // <复合语句>
{
if(strcmp(Symbol[1],"LBrace") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"const") == 0)
{
while(strcmp(Symbol[1],"const") == 0)
{
ConstDec();
}
}
if(strcmp(Symbol[1],"int") == 0)
{
while(strcmp(Symbol[1],"int") == 0)
{
VariDec();
}
}
StmtList();
if(strcmp(Symbol[1],"RBrace") != 0)
Error(6);
else
NextSym(temp);
}
else
{
Error(6);
NextSym(temp);
}
}
void Stmt() // <语句>
{
if(strcmp(Symbol[1],"if") == 0)
{
CondStmt();
}
else if(strcmp(Symbol[1],"while") == 0)
{
LoopStmt();
}
else if(strcmp(Symbol[1],"LBrace") == 0)
{
NextSym(temp);
StmtList();
if(strcmp(Symbol[1],"RBrace") != 0)
Error(14);
else
NextSym(temp);
}
else if(strcmp(Symbol[1],"ID") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"LParen") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"RParen") != 0)
VParamList();
if(strcmp(Symbol[1],"RParen") != 0)
Error(14);
else
{
/*NextSym(temp);
Stmt();
if(strcmp(Symbol[1],"LBarce") == 0) // 子函数调用
{
NextSym(temp);
if(strcmp(Symbol[1],"else") == 0)
{
while(strcmp(Symbol[1],"else") == 0)
{
NextSym(temp);
Stmt();
}
}
else
Error(15);
}
else
return;*/
NextSym(temp);
if(strcmp(Symbol[1],"SEMIC") != 0)
{
Error(23);
}
else
NextSym(temp);
}
}
else if(strcmp(Symbol[1],"ASSIGN") == 0) // 否则是赋值语句
{
NextSym(temp);
/*
if(strcmp(Symbol[1],"ID") != 0)
Error(13);
else
NextSym(temp);
*/
Express();
if(strcmp(Symbol[1],"SEMIC") != 0)
{
Error(23);
}
else
NextSym(temp);
}
else
Error(22);
}
else if(strcmp(Symbol[1],"return") == 0)
{
RtnStmt();
if(strcmp(Symbol[1],"SEMIC") != 0)
Error(22);
else
NextSym(temp);
}
else if(strcmp(Symbol[1],"scanf") == 0)
{
ReadStmt();
if(strcmp(Symbol[1],"SEMIC") != 0)
Error(23);
else
NextSym(temp);
}
else if(strcmp(Symbol[1],"printf") == 0)
{
WriteStmt();
if(strcmp(Symbol[1],"SEMIC") != 0)
Error(23);
else
NextSym(temp);
}
else if(strcmp(Symbol[1],"SEMIC") == 0)
NextSym(temp);
else
{
Error(22);
}
}
void AssStmt() // <赋值语句>
{
if(strcmp(Symbol[1],"ID") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"ASSIGN") == 0)
{
NextSym(temp);
Express();
}
else
Error(13);
}
Error(13);
}
void CondStmt() // <条件语句>
{
if(strcmp(Symbol[1],"if") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"LParen") == 0)
{
NextSym(temp);
Condition();
if(strcmp(Symbol[1],"RParen") == 0)
{
NextSym(temp);
Stmt();
/*
if(strcmp(Symbol[1],"LBrace") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"else") == 0)
{
Stmt();
if(strcmp(Symbol[1],"RBrace") == 0)
NextSym(temp);
else
Error(14);
}
else
Error(15);
}
else
Error(15);
*/
if(strcmp(Symbol[1],"else") == 0)
{
while(strcmp(Symbol[1],"else") == 0)
{
NextSym(temp);
Stmt();
}
}
}
else
Error(15);
}
else
{
Error(15);
}
}
else
{
Error(15);
}
}
void Condition() // <条件>
{
Express();
if(strcmp(Symbol[1],"ROP") == 0)
{
NextSym(temp);
Express();
}
/*else
{
return;
}
*/
}
void LoopStmt() // <循环语句>
{
if(strcmp(Symbol[1],"while") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"LParen") == 0)
{
NextSym(temp);
Condition();
if(strcmp(Symbol[1],"RParen") != 0)
Error(14);
else
NextSym(temp);
Stmt();
}
else
Error(16);
}
else
Error(16);
}
void CallFunc() // <子函数调用语句>
{
if(strcmp(Symbol[1],"ID") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"LParen") == 0)
{
VParamList();
if(strcmp(Symbol[1],"RParen") != 0)
Error(14);
else
NextSym(temp);
}
else
Error(17);
}
else
Error(17);
}
void StmtList() // <语句序列>
{
Stmt();
// NextSym(temp);
while(strcmp(Symbol[1],"RBrace") != 0)
{
Stmt();
}
}
void ReadStmt() // <读语句>
{
if(strcmp(Symbol[1],"scanf") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"LParen") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"ID") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"RParen") != 0)
Error(14);
else
NextSym(temp);
}
else
Error(19);
}
else
Error(19);
}
else
Error(19);
}
void WriteStmt() // <写语句>
{
if(strcmp(Symbol[1],"printf") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"LParen") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"STRING") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"COLOM") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"ID") == 0)
{
Express();
if(strcmp(Symbol[1],"RParen") != 0 )
Error(14);
else
NextSym(temp);
}
else
Error(20);
}
else
{
if(strcmp(Symbol[1],"RParen") != 0)
{
Error(14);
}
else
{
NextSym(temp);
}
/*
if(strcmp(Symbol[1],"SEMIC") != 0)
Error(23);
else
NextSym(temp);*/
}
}
else if(strcmp(Symbol[1],"ID") == 0 || strcmp(Symbol[1],"INTEGER") == 0) // 错了。i
{
//NextSym(temp);
//if(strcmp(Symbol[1],"RParen") != 0)
//{
// Error(20);
//}
//else
//{
// NextSym(temp);
/*
if(strcmp(Symbol[1],"SEMIC") != 0)
Error(23);
else
NextSym(temp);*/
//}
Express();
NextSym(temp);
}
}
else
Error(20);
}
}
void RtnStmt() // <返回语句>
{
if(strcmp(Symbol[1],"return") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"SEMIC") == 0)
{
return ;
}
else if(strcmp(Symbol[1],"LParen") == 0)
{
NextSym(temp);
/*
if(strcmp(Symbol[1],"ID") == 0)
{
NextSym(temp);
if(strcmp(Symbol[1],"RParen") != 0)
Error(21);
else
NextSym(temp);
}
else
{
Error(21);
}*/
Express();
if(strcmp(Symbol[1],"RParen") != 0)
Error(21);
else
NextSym(temp);
}
else
Error(21);
}
else
Error(21);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -