资源简介
用扩充的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
相关资源
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- LL(1)文法的递归下降分析程序例题
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
- 华工往年编译原理试卷
- 编译原理课程设计for循环LR法三元式
- 哈工程-编译原理课程设计(2016级)
- 龙书《编译原理》(Compilers:Principle
- 编译原理复习题
- 天津理工大学编译原理实验2
- 程序设计语言编译原理_陈火旺_第3版
- 编译原理CP lab实验报告.doc
- 编译原理.zip
- 编译原理基础习题与上机题解答
- LR0分析表自动生成程序_界面输入产生
- 编译原理与实践课后习题答案中文英
评论
共有 条评论