软工班
实验容
二 实验目
三 实验求
四 程序流程图
l 函数
l scanner()
l irparser()函数
l yucu() *语句串分析*
l statement()*语句分析函数*
l expression()*表达式分析函数*
l term()*项分析函数*
l factor()*子分析函数*
五 程序代码
六 测试例
七 输出结果
八 实验心
实验容:
编写文关文法构造递降语法分析程序输入串进行语法分析检查程序求输入串进行递降语法分析判程序否符合已知语法规果符合(编译出错)输出错误信息
二实验目:
构造文法语法分析程序求采递降语法分析方法输入字符串进行语法分析实现词法分析程序提供单词序列语法检查结构分析进步掌握递降语法分析方法
三实验求:
利C语言编制递降分析程序Training语言进行语法分析
1. 分析Training语言语法
扩充表示:
<程序>>function<语句串>endfunc
<语句串>><语句>{<语句>}
<语句>à<赋值语句>
<赋值语句>àIDà<表达式>
<表达式>à<项>{+<项>|<项>}
<项>à<子>{*<子>|<子>}
<子>àID|NUM|(<表达式>)
备注:实验中 程序进行扩展增加程序识if条件判断语句while循环语句功
2. 实验求说明
输入单词串#结束果文法正确句子输出成功信息印success否输出error
四程序流程图
函数:
Scanner()函数:
irparser()函数
yucu() *语句串分析*
statement()*语句分析函数*
expression()*表达式分析函数*
term()*项分析函数*
factor()*子分析函数*
五程序代码:
递降分析文法
<程序>>function< 语句串 >endfunc
<语句串>><语句>{ <语句> }
<语句>à<赋值语句> |
<赋值语句>à <表达式>
<表达式>à<项>{ +<项> | <项> }
<项>à<子>{*<子>|<子>}
<子>àID | NUM | (<表达式>)
备注:红色字体部分代码实现功修改扩展部分
*语法分析源代码*
#include
#include
char prog[80]token[8]
char ch
int synpm0nsumkk0
char *rwtab[6]{functionifthenwhiledoendfunc}
void yucu()
void expression()
void statement()
void factor()
void term()
void irparser()
void scaner()
{ for (n0n<8n++)
token[n]NULL
while(ch' ' || ch'\n')
chprog[p++]
m0
if((ch<'z' && ch>'a') || (ch<'Z' && ch>'A'))
{while((ch<'z' && ch>'a') || (ch<'Z' && ch>'A') || (ch<'9' && ch>'0'))
{token[m++]ch
chprog[p++]
}
syn10
for(n0n<6n++)
if(strcmp(tokenrwtab[n])0)
{ synn+1
break
}
token[m++]'\0'}
else
if(ch<'9' && ch>'0')
{ sum0
while(ch<'9' && ch>'0')
{ sumsum*10+ch'0'
chprog[p++]
}
syn11
}
else
{ switch(ch)
{ case'<'m0token[m++]ch
chprog[p++]
if(ch'')
{syn22
token[m+1]ch}
else
{syn20chprog[p]}
break
case'>'m0token[m++]ch
chprog[p++]
if(ch'')
{ syn24
token[m++]ch
}
else
{syn23p
}
break
case'' m 0token[m ++ ]ch
chprog[p++]
if(ch'')
{ syn 25
token[m++] ch
}
else
{syn18
chprog[p]
}
break
case''m0 token[m++] ch
chprog[++p]
if(ch'')
{ syn22
token[m++] ch
}
else
syn1
break
case'+'syn13 token[0]chbreak
case''syn14 token[0]chbreak
case'*'syn15 token[0]chbreak
case''syn16 token[0]chbreak
case''syn26 token[0]chbreak
case'('syn27 token[0]chbreak
case')'syn28 token[0]chbreak
case'#'syn0 token[0]chbreak
defaultsyn1break
}
chprog[p++]
} }
void irparser()
{ if(syn1)
{ scaner()
yucu()*语句串分析*
if(syn6) *读endfunc*
{ scaner()
if(syn0&&kk0)*程序分析识完*
printf(success)
}
else
{ if(kk1) *没endfunc结束*
{ printf(errorneed 'endfunc')
kk1
}
}
}
else
{ printf(errorneed'function')
kk1
}
}
void yucu() *语句串分析*
{ statement()*调语句分析函数*
while(syn26)*语句识结束继续识*
{ scaner()
statement()
}
return
}
void statement()*语句分析函数*
{ if(syn10)
{ scaner()
if(syn18) 果赋值语句
{ scaner()
expression()
} 程实现语法分析判断语句
else
{ printf(errorevaluate tag error)
kk1
}
}
else
if(syn6)
return
else
if(syn2) 果条件判断语句 判断条件表达式语法
{ scaner()
if(syn27) 判断括号匹配
{do
{scaner() 进入括号部进行表达式分析
expression()
}while(syn28)
}
else { printf(error need another')')
kk1
} ()判断完成
scaner() 然进行语句块分析
statement()
} 里实现判断if语句语法分析
类似里添加 循环语句
else
if(syn4) 果循环语句 判断条件表达式语法
{ scaner()chprog[p++]
if(syn27)
{ do
{scaner()
expression()
}while(syn28)
}
else {
printf(error need another')')
kk1 } ()判断完成
scaner() 然进行语句块分析
statement()
} 里实现判断while语句语法分析
else
{ printf(errorthe statement error)
kk1
}
}
void expression()*表达式分析函数*
{ term()
while(syn13||syn14)
{ scaner()
term() }
return
}
void term()*项分析函数*
{ factor()
while(syn15||syn16)
{ scaner()
factor()}
return
}
void factor()*子分析函数*
{ if(syn10||syn11)
{ scaner() }
else*否表达式*
{ expression()
if(syn27)
{ scaner()
expression()
if(syn28)
{ scaner()}
else
{ printf(error need another')')
kk1
}
}
else
{ printf(error expression error)
}
}
}
void main()
{ p0
printf(\n please input the string\n)
do
{ chgetchar()
prog[p++]ch
} while(ch'#')
p0
chprog[p++]
scaner()
irparser()
}
六测试例
测试例1
输出结果
测试例2
输出结果
测试例3
输出结果
function
a1
b2
ca+b
endfunc
#
success
function
if(3>1)
a1
endfunc
#
success
function
if(a>b)
a1
while(a>1)
b1
endfunc
#
success
测试例4
a1
endfunc
#
输出结果
errorneed'function'Press any key to continue
七输出结果
测试例1
测试例2
测试例4
测试例3
八实验心
通编译原理实验二语法分析实验语法分析流程更深刻解语法分析递思想更加具体化然源代码非设计调试程序程中逐步理解程序递降思想思路断理清仅理解程序分析赋值语句算法时基础程序做功扩展增加语法分析条件判断语句while条件循环语句程序中红色字体部分调试算法功扩展程中理清语法分析程序思路开始程序陌生逐步解程序流程耐心步步理解程序思想次次更改测试例遍遍调试终终预期答案次实验理语法分析递降理解更加具体清晰受益匪浅
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档