编程实现给定算术表达式的递归下降分析器。
一、实验题目:
编程实现给定算术表达式的递归下降分析器。
算术表达式文法如下: E→E+T | T
T→T*F | F
F→(E) | i
设计说明:
首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。
二、设计分析:
(1)消除文法左递归:
E→TE’
E’→+TE’|ɛ
T→FT’
T’→*FT’|ɛ
F→(E)|i
(2)判断改写后的文法是否为LL(1)文法
对E’:First(+TE’) Ո Follow(E’)={+} Ո {#,)}=Φ
对T’:First(*FT’) Ո Follow(T’)={*} Ո {#,),+}=Φ
对F:First(i) Ո Follow((E))={i} Ո {(}=Φ
(3)所以改写后的文法是LL(1)文法
三、程序代码:
#include<iostream>
using namespace std;
string s;
char c;
bool flag=true;
int cnt;
void E();
void E1();
void T();
void T1();
void F();
void scan(){
c=s[++cnt];
}
void E(){
T();
E1();
}
void T(){
F();
T1();
}
void E1(){
if(c=='+'){
scan();
T();
E1();
}else if(c!=')'&&c!='\0'){
if(flag){
cout<<"Error!"<<endl;
flag=false;
}
}
}
void T1(){
if(c=='*'){
scan();
F();
T1();
}else if(c!=')'&&c!='\0'&&c!='+'){
if(flag){
cout<<"Error!"<<endl;
flag=false;
}
}
}
void F(){
if(c=='i') scan();
else{
if(c=='('){
scan();
E();
if(c==')'){
scan();
}else{
if(flag){
cout<<"Error!"<<endl;
flag=false;
}
}
}
}
}
int main(){
cout<<"请输入程序源代码: ";
cin>>s;
c=s[cnt];
E();
if(c=='\0'){
cout<<"Success!"<<endl;
}else{
if(flag){
cout<<"Error!"<<endl;
flag=false;
}
}
return 0;
}

浙公网安备 33010602011771号