资源简介

用扩充的BNF表示如下: (1)::=beginend (2)::={;} (3)::= (4)::=ID:= (5)::={+|-} (6)::={*|/} (7)::=ID| NUM|()

资源截图

代码片段和文件信息

#include
#include
#include

using namespace std;

char prog[80];//缓冲区
int p=0;//缓冲区prog的指针

char token[8];//单词
int m=0;//单词token的指针

char ch;//需要分析的字符

int syn=0;//单词的种别码

int sum=0;//计算整数

int n=0;//计数器
int kk=0;

char *rwtab[6]={“begin““if““then““while““do““end“};//关键字


void scaner();//扫描函数
void factor();//因子
void term();//项
void expression();//表达式
void statement();//语句
void yucu();//语句串
void lrparser();//语法分析

//扫描函数
void scaner()
{
for(n=0;n<8;n++) token[n]=NULL;
    ch=prog[p++];

    while(ch==‘ ‘)
        ch=prog[p++];

if ((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘))
{
m=0;
while ((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=‘0‘&&ch<=‘9‘))
{
token[m++]=ch;//将当前字符存入单词
ch=prog[p++];//取下一个
}

token[m++]=‘\0‘;//结束符

p--;//指针归位

syn=10;//假定是变量

for (n=0;n<6;n++)
{
if (strcmp(tokenrwtab[n])==0)
{
syn=n+1;//关键字!
break;
}
}
}
else
if(ch>=‘0‘&&ch<=‘9‘)
{
sum=0;
while (ch>=‘0‘&&ch<=‘9‘)
{
sum=sum*10+ch-‘0‘;//计算数字
ch=prog[p++];
}
p--;//指针归位
syn=11;//是数字!
}
else
switch (ch)
{
case‘>‘ :
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch==‘=‘)
{
syn=24;//是“>=”
token[m++]=ch;//将“=”存入单词
}
else
{
syn=23;//是“>”
p--;//指针归位
}
break;

case‘<‘:
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch==‘>‘)
{
syn=21;//是“<>”
token[m++]=ch;//将“>”存入单词
}
else
{
if (ch==‘=‘)
{
syn=22;//是“<=”
token[m++]=ch;//将“=”存入单词
}
else
{
syn=20;//是“<”
p--;//指针归位
}
}
break;

case‘:‘:
m=0;
token[m++]=ch;
ch=prog[p++];
if (ch==‘=‘)
{
syn=18;
token[m++]=ch;

else
{
syn=17;
p--;
}
break;

case‘-‘:
syn=13;
token[0]=ch;
break;

case‘+‘:
syn=14;
token[0]=ch;
break;

case‘*‘:
syn=15;
token[0]=ch;
break;

case‘/‘:
syn=16;
token[0]=ch;
break;

case‘;‘:
syn=26;
token[0]=ch;
break;

case‘(‘:
syn=28;
token[0]=ch;
break;

case‘)‘:
syn=27;
token[0]=ch;
break;

case‘#‘:
syn=0;
token[0]=ch;
break;

default:syn=-1;
}
}

//因子
void factor()
{ if(syn==10||syn==11)
        scaner(); //为标识符或整常数时,读下一个单词符号
    else if(syn==27)
    {
        scaner();
        expression();
        if(syn==28)
            scaner();
        else
        {
            printf(“ ‘)‘ 错误\n“);
            kk=1;
        }
    }
    else
    {
        printf(“表达式错误\n“);
        kk=1;
    }
 

//问题1---补充程序代码

return;
}

//项
void term()

factor();

while(syn==15||syn==16)
{
scaner();
factor();
}
return;
}

//表达式
void expression()

  term();

    while

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     117248  2014-04-23 19:18  编译原理 递归\实验2-1 语法分析-递归下降分析法.doc

     文件       4308  2014-04-23 09:22  编译原理 递归\递归.cpp

     目录          0  2014-04-23 20:07  编译原理 递归

----------- ---------  ---------- -----  ----

               121556                    3


评论

共有 条评论