📄 analyzer.cpp
字号:
}
else
if(20==GetCurRS()->type)
{
YuErrorNo=4;//缺少标识符"#"!
ErrorAddr=m_pCurRS;
return false;
}
else
{
YuErrorNo=2;//有非法字符
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
m_pCurRS++;
}
//以上处理包含文件
Chengxuti();
return true;
}
int CAnalyzer::Chengxuti()
{
switch (GetCurRS()->type)
{
case 32: //void
m_pCurRS++;
case 3: //main
m_pCurRS++;
break;
default:
YuErrorNo=2; //非法字符
ErrorAddr=m_pCurRS;
return false;
}
if(56==GetCurRS()->type) //(
{
m_pCurRS++;
if(57!=GetCurRS()->type)
{
YuErrorNo=9; //界符"("不匹配!
ErrorAddr=m_pCurRS;
return false;
}
}
else
{
YuErrorNo=8; //main函数格式错误
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
if(49!=GetCurRS()->type)//{
{
YuErrorNo=12; //缺少main()后}
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
/////////////////////////////////////////////////////////////
switch(GetCurRS()->type)
{
case 6: //char
case 16://float
case 21://int
if(!BLshengming()) return false; //将声明语句分析完毕包括分号,指针指向下一语句
break;
default:
YuErrorNo=11;//缺少声明语句
ErrorAddr=m_pCurRS;
return false;
}
if (!YuJuChuan()) //语句串//分析所有非声明语句
return false; //
///////////////////////////////////////////////////////////
switch (GetCurRS()->type)
{ //处理最后一个}
case 50: //}
break;
default:
YuErrorNo=12; //缺少保留字“}”!
ErrorAddr=--m_pCurRS;
return false;
}
return true;
}
/* */
/************************************************************/
int CAnalyzer::shengming()
{//将声明语句分析完毕包括分号,指针指向下一语句
/* switch (GetCurRS()->type)
{
case 6://integer
case 16://real
case 21://char
if (!BLshengming()) return FALSE;
break;
// case 5://子函数
//if (!r_GChShuoMing()) return FALSE;
// break;
default:
YuErrorNo=13;//
return FALSE;
}
*/
return true;
}
int CAnalyzer::BLshengming()
{ //将声明语句分析完毕包括分号,指针指向下一语句
int i=0;
while(1)
{
switch (GetCurRS()->type)
{
case 6: //char
case 16: //float
case 21: //int
break;
default:
YuErrorNo=14; //缺少变量类型
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
switch (GetCurRS()->type)
{
case 1: //id
::strcpy(BianLiang[++i],GetCurRS()->text);//记录单词
break;
default:
YuErrorNo=15; //变量声明后缺少标识符!
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
while (51==GetCurRS()->type)
{//51 , 分析用逗号隔开的连续声明的几个变量
m_pCurRS++;
switch (GetCurRS()->type)
{
case 1: //id
::strcpy(BianLiang[++i],GetCurRS()->text);//记录单词
break;
default:
YuErrorNo=15; //变量声明后缺少标识符
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
}
if(52!=GetCurRS()->type)//;
{
YuErrorNo=10; //缺少;
ErrorAddr=m_pCurRS;
return false;
}
else
m_pCurRS++;
if(6!=GetCurRS()->type&&16!=GetCurRS()->type&&21!=GetCurRS()->type)
break;
}
return true;
}
int CAnalyzer::YuJuChuan()
{
if (!YuJu()) //分析四种语句:赋值,表达式,循环,条件语句,处理分号,指向新语句
return false;
if(-1==GetCurRS()->type)
return true;
while (-1!=GetNextRS()->type) //no!!!!!
{
if (!YuJu())
return false;
if(-1==GetCurRS()->type)
return true;
}
return true;
}
int CAnalyzer::YuJu()
{
switch (GetCurRS()->type)
{
case 1: //bl
if(!FindInBL(GetCurRS()->text))
{//变量定义否
YuErrorNo=13; //未定义
ErrorAddr=m_pCurRS;
return false;
}
switch(GetNextRS()->type)
{
case 34: // +
case 35: // -
case 36: // *
case 37: // /
case 39: //+=
case 40: //-=
case 41: //++
case 42: //--
if(!BiaoDaShi())
return false;
if(52==GetCurRS()->type)
m_pCurRS++;
else
{
YuErrorNo=10; //未定义
ErrorAddr=m_pCurRS;
return false;
}
break;
default:
if (!FuZhiYuJu())
return false;
break;
}
break;
case 19: //if
if (!TiaoJianYuJu())
return false;
break;
case 33: //while
case 17: //for
case 11: //do
if (!XunHuanYuJu())
return false;
break;
// case 13: //call
// if (!GuoChengYuJu()) return false;
// break;
// case 50: //}
// break;
default:
YuErrorNo=17; //
ErrorAddr=m_pCurRS;
return false;
}
return true;
}
int CAnalyzer::FuHeYuJu()
{
return true;
}
int CAnalyzer::FuZhiYuJu()
{ //调用后指向新语句
/* if(!FindInBL(GetCurRS()->text))
{//变量定义否
YuErrorNo=13; //未定义
ErrorAddr=m_pCurRS;
return false;
}
*/
m_pCurRS++;
switch (GetCurRS()->type)
{
case 38: //=
break;
default:
YuErrorNo=19; //缺少赋值符号“ = ”!
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
if (!BiaoDaShi())
return false;
if(52!=GetCurRS()->type)
{
YuErrorNo=10; //缺少;
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++; //指向新语句
return true;
}
int CAnalyzer::TiaoJianYuJu()
{
m_pCurRS++;
if(56!=GetCurRS()->type)//(
{
YuErrorNo=9;
ErrorAddr=m_pCurRS;
return false;
}
else
m_pCurRS++;
if (!BoolBiaoDaShi()) //表达式
return false;
if(57!=GetCurRS()->type)//)
{
YuErrorNo=9;
ErrorAddr=m_pCurRS;
return false;
}
else
m_pCurRS++;
if (!YuJu()) //语句
return false;
switch (GetCurRS()->type)
{
case 13: //else
break;
default:
return true;
}
m_pCurRS++;
if (!YuJu()) //语句
return false;
//m_pCurRS++;
return true;
}
int CAnalyzer::XunHuanYuJu()
{
int flag1,flag2;
flag1=flag2=0;
switch (GetCurRS()->type)
{
case 17://for
m_pCurRS++;
switch (GetCurRS()->type)
{
case 56: //(
break;
default:
YuErrorNo=23;//for error~!//21缺少while//未
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
if(!FuZhiYuJu()) //赋值语句
return false;
if(!BoolBiaoDaShi()) //表达式
return false;
m_pCurRS++;
if(!BiaoDaShi()) //表达式
return false;
if(57==GetCurRS()->type) //)
m_pCurRS++;
else
{
YuErrorNo=23;//for error~!//21缺少while
ErrorAddr=m_pCurRS;
return false;
}
break;
case 11://do
flag2=1;
m_pCurRS++;
if(49==GetCurRS()->type)
{
flag1=1;
m_pCurRS++;
}
if (!YuJu())
return false;
if(1==flag1&&50==GetCurRS()->type)
m_pCurRS++;
else
{
YuErrorNo=12;//缺少
ErrorAddr=m_pCurRS;
return false;
}
case 33://while
m_pCurRS++;
switch (GetCurRS()->type)
{
case 56: //(
m_pCurRS++;
break;
default:
YuErrorNo=23;//for error~!//21缺少while//未
ErrorAddr=m_pCurRS;
return false;
}
if(!BoolBiaoDaShi()) //表达式
return false;
if(57==GetCurRS()->type) //)
m_pCurRS++;
else
{
YuErrorNo=23;//for error~!//21缺少while
ErrorAddr=m_pCurRS;
return false;
}
if(1==flag2)
{
//m_pCurRS++;
if(52==GetCurRS()->type)//;
{
m_pCurRS++;
break;
}
else
{
YuErrorNo=10;//;
ErrorAddr=m_pCurRS;
return false;
}
}
else
{
//m_pCurRS++;
if(49==GetCurRS()->type)
{
flag1=1;
m_pCurRS++;
}
if (!YuJu())
return false;
if(1==flag1&&50==GetCurRS()->type||0==flag1)
m_pCurRS++;
else
{
YuErrorNo=12;
ErrorAddr=m_pCurRS;
return false;
}
}
break;
}
return true;
}
int CAnalyzer::BiaoDaShi()
{//指向分号
if(4==GetNextRS()->type||40==GetNextRS()->type||42==GetNextRS()->type)
{//++ -- break;
m_pCurRS++;m_pCurRS++;
return true;
}
if (!Xiang())
return false;
while (34==GetCurRS()->type||35==GetCurRS()->type
||36==GetCurRS()->type||37==GetCurRS()->type) //+ - * /
{
m_pCurRS++;
if (!Xiang())
return false;
}
return true;
}
int CAnalyzer::Xiang()
{
if (!YinZi())
return false;
while (34==GetCurRS()->type||35==GetCurRS()->type
||36==GetCurRS()->type||37==GetCurRS()->type)
{// +,-,*,/
m_pCurRS++;
if (!YinZi())
return false;
}
return true;
}
int CAnalyzer::YinZi()
{
switch (GetCurRS()->type)
{
case 1: //id
m_pCurRS++;
break;
case 2: //num
m_pCurRS++;
break;
case 56: //(
m_pCurRS++;
if (!BiaoDaShi()) //递归调用
return false;
switch (GetCurRS()->type)
{
case 34: //)
break;
default:
YuErrorNo=17; //缺少 “ ) ”符号!
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
break;
default:
YuErrorNo=28; //运算式不完全
ErrorAddr=m_pCurRS;
return false;
}
return true;
}
int CAnalyzer::BoolBiaoDaShi()
{
switch (GetCurRS()->type)
{
case 20: //~
m_pCurRS++;
if (!BoolBiaoDaShi())
return false;
break;
case 33: //(
case 1: //id
case 2: //num
if (!GuanXiShi())
return false;
while (GetCurRS()->type==21 || GetCurRS()->type==22) // & |
{
m_pCurRS++;
if (!BoolBiaoDaShi())
return false;
}
break;
default:
YuErrorNo=29; //"缺少 '布尔表达式'
ErrorAddr=m_pCurRS;
return false;
}
return true;
}
int CAnalyzer::GuanXiShi()
{
if (!BiaoDaShi()) //表达式
return false;
if (!GuanXi()) //关系
return false;
if (!BiaoDaShi()) //表达式
return false;
return true;
}
int CAnalyzer::GuanXi()
{
switch (GetCurRS()->type)
{
case 54: //<
case 55: //<=
case 44: //>
case 45: //>=
case 46: //=
case 47: //<>
break;
default:
YuErrorNo=30; //缺少关系(<,<=,>,>=,=,<>)!
ErrorAddr=m_pCurRS;
return false;
}
m_pCurRS++;
return true;
}
CifaResult * CAnalyzer::GetCurRS()
{
return m_tCifa[m_pCurRS];
}
CifaResult * CAnalyzer::GetNextRS()
{
return m_tCifa[m_pCurRS+1];
}
int CAnalyzer::FindInBL(char *a)
{
for (int i=0;i<KEY_WORD_TABLE_LEN;i++)
if (!::stricmp(BianLiang[i],a)) return i;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -