语法分析递归下降分析程序.docx
- 文档编号:24167949
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:14
- 大小:30.66KB
语法分析递归下降分析程序.docx
《语法分析递归下降分析程序.docx》由会员分享,可在线阅读,更多相关《语法分析递归下降分析程序.docx(14页珍藏版)》请在冰豆网上搜索。
语法分析递归下降分析程序
实验报告
课程名称:
编译原理
实验项目:
语法分析
专业班级:
计算机科学与技术班
姓名:
学号:
实验室号:
实验组号:
实验时间:
批阅时间:
指导教师:
成绩:
沈阳工业大学实验报告
(适用计算机程序设计类)
专业班级:
计算机科学与技术1301班学号:
姓名:
实验名称:
1.实验目的:
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
2.实验要求:
1.待分析的简单语法的语法用扩充的BNF表示如下:
(1)<程序>:
:
=begin<语句串>end
(2)<语句串>:
:
=<语句>{:
语句}
(3)<语句>:
:
=<赋值语句>
(4)<赋值语句>:
:
=ID:
=<表达式>
(5)<表达死>:
:
=<项>{+<项>|-<项>}
(6)<项>:
:
=<因子>{*<因子>|/<因子>}
(7)<因子>:
:
=ID|NUM|(<表达式>)
3.实验内容:
输入单词串,以”#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出”error”
例如:
输入begina:
=9;x:
=2*3;b:
=a+xend#
输出success
输入x:
=a+b*cend#
输出error
4.程序运行结果
图1程序运行结果
图2程序运行结果
主要代码:
#include
#include
#include
#define_KEY_WORD_END"waitingforyourexpanding"
typedefstruct
{
inttypenum;
char*word;
}WORD;
charinput[255];
chartoken[255]="";
intp_input;
intp_token;
charch;
char*KEY_WORDS[]={"begin","if","then","while","do","end",_KEY_WORD_END};
WORD*scaner();
voidlrParser();
voidyucu();
voidstatement();
voidstatement();
voidexpression();
voidterm();
voidfactor();
intsyn;
intkk;
WORD*oneword=newWORD;
voidmain()
{
intover=1;
printf("EnterYourwords(endwith#):
");
scanf("%[^#]s",input);
p_input=0;
printf("Yourwords:
\n%s\n",input);
while(over<1000&&over!
=0){
oneword=scaner();
if(oneword->typenum<1000)
printf("(%d,%s)\n",oneword->typenum,oneword->word);
over=oneword->typenum;
}
p_input=0;
oneword=scaner();
lrParser();
printf("\npress#toexit:
");
scanf("%[^#]s",input);
}
voidlrParser()
{
if(syn==1)
{
oneword=scaner();
yucu();
if(syn==6)
{
oneword=scaner();
if(syn==0&&kk==0)
{
printf("%s","success");
}else
{
if(kk!
=1){
printf("%s","缺'end'错误");
kk=1;
}
}
}
}else{
printf("%s","缺'begin'错误");
kk=1;
}
}
voidyucu(){
statement();
while(syn==26){
oneword=scaner();
statement();
}
}
voidstatement(){
if(syn==10){
oneword=scaner();
if(syn==18){
oneword=scaner();
expression();
}else{
printf("%s","赋值号错误");
kk=1;
}
}else{
printf("%s","语句错误");
kk=1;
}
}
voidexpression(){
term();
while(syn==13||syn==14){
oneword=scaner();
term();
}
}
voidterm(){
factor();
while(syn==15||syn==16){
oneword=scaner();
factor();
}
}
voidfactor(){
if(syn==10||syn==11){
oneword=scaner();
}elseif(syn==27){
oneword=scaner();
expression();
if(syn==28){
oneword=scaner();
}else{
printf("%s","')'错误");
kk=1;
}
}else{
printf("%s","表达式错误");
kk=1;
}
}
charm_getch(){
ch=input[p_input];
p_input=p_input+1;
return(ch);
}
voidgetbc(){
while(ch==''||ch==10){
ch=input[p_input];
p_input=p_input+1;
}
}
voidconcat(){
token[p_token]=ch;
p_token=p_token+1;
token[p_token]='\0';
}
intletter(){
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')return1;
elsereturn0;
}
intdigit(){
if(ch>='0'&&ch<='9')return1;
elsereturn0;
}
intreserve(){
inti=0;
while(strcmp(KEY_WORDS[i],_KEY_WORD_END)){
if(!
strcmp(KEY_WORDS[i],token)){
returni+1;
}
i=i+1;
}
return10;
}
voidretract(){
p_input=p_input-1;
}
char*dtb(){
returnNULL;
}
WORD*scaner(){
WORD*myword=newWORD;
myword->typenum=10;
syn=myword->typenum;
myword->word="";
p_token=0;
m_getch();
getbc();
if(letter()){
while(letter()||digit()){
concat();
m_getch();
}
retract();
myword->typenum=reserve();
syn=myword->typenum;
myword->word=token;
//printf("(%d,%s)",syn,token);
return(myword);
}
elseif(digit()){
while(digit()){
concat();
m_getch();
}
retract();
myword->typenum=11;
syn=myword->typenum;
myword->word=token;
//printf("(%d,%s)",syn,token);
return(myword);
}
elseswitch(ch){
case'=':
myword->typenum=25;
syn=myword->typenum;
myword->word="=";
return(myword);
break;
case'+':
myword->typenum=13;
syn=myword->typenum;
myword->word="+";
return(myword);
break;
case'-':
myword->typenum=14;
syn=myword->typenum;
myword->word="-";
return(myword);
break;
case'*':
myword->typenum=15;
syn=myword->typenum;
myword->word="*";
return(myword);
break;
case'/':
myword->typenum=16;
syn=myword->typenum;
myword->word="/";
return(myword);
break;
case'(':
myword->typenum=27;
syn=myword->typenum;
myword->word="(";
return(myword);
break;
case')':
myword->typenum=28;
syn=myword->typenum;
myword->word=")";
return(myword);
break;
case':
':
m_getch();
if(ch=='='){
myword->typenum=18;
syn=myword->typenum;
myword->word=":
=";
return(myword);
}
retract();
myword->typenum=17;
syn=myword->typenum;
myword->word=":
";
return(myword);
break;
case';':
myword->typenum=26;
syn=myword->typenum;
myword->word=";";
return(myword);
break;
case'>':
m_getch();
if(ch=='='){
myword->typenum=24;
syn=myword->typenum;
myword->word=">=";
return(myword);
}
retract();
myword->typenum=23;
syn=myword->typenum;
myword->word=">";
return(myword);
break;
case'<':
m_getch();
if(ch=='='){
myword->typenum=22;
syn=myword->typenum;
myword->word="<=";
return(myword);
}
if(ch=='>'){
myword->typenum=21;
syn=myword->typenum;
myword->word="<>";
return(myword);
}
retract();
myword->typenum=20;
syn=myword->typenum;
myword->word="<";
return(myword);
break;
default:
myword->typenum=0;
syn=myword->typenum;
myword->word="#";
return(myword);
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法分析 递归 下降 分析 程序