
struct BiNode
{
char data
BiNode *lchild, *rchild
}
typedef BiNode *BiTree
int CreateBiTree(BiTree &T, const char *s1, const char *s2, int len)
{
if (len<=0)
{
T = NULL
return 1
}
else
{
T = new BiNode
T->data = *s1
int i
for ( i=0i<leni++) if (s2[i]==*s1) break
CreateBiTree(T->lchild, s1+1, s2, i)
CreateBiTree(T->rchild, s1+i+1, s2+i+1, len-(i+1))
}
return 1
}
int DestroyBiTree(BiTree &T)
{
if (T==NULL) return 1
DestroyBiTree(T->lchild)
DestroyBiTree(T->rchild)
delete T
T = NULL
return 1
}
int ATraverse(BiTree &T)
{
if (T==NULL) return 1
ATraverse(T->lchild)
ATraverse(T->rchild)
cout<<T->data
return 1
}
main()
{
char a[2000],b[2000]
while(cin>>a>>b)
{
BiTree T
int count=0
int n
for(n=0a[n]!='\0'n++)
CreateBiTree(T,a,b,n)
ATraverse(T)
cout<<" "
cout<<endl
DestroyBiTree(T)
这个是精简的语法分析程序,如果符合的话,hi我给你实验报告
#include <stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>
char a[50] ,b[50]
char ch
int n1,i1=0,n=5
int E()int T()int E1()int T1()int F()
void main() /*递归分析*/
{
int f,j=0
printf("请输入字符串(长度<50,以#号结束)\n")
do{
scanf("%c",&ch)
a[j]=ch
j++
}while(ch!='#')
n1=j
ch=b[0]=a[0]
f=E()
if (f==0) return
if (ch=='#') printf("accept\n")
else printf("error\n")
}
int E() // E→TE'
{ int f,t
f=T()
if (f==0) return(0)
t=E1()
if (t==0) return(0)
else return(1)
}
int T() // T→FT'
{ int f,t
f=F()
if (f==0) return(0)
t=T1()
if (t==0) return(0)
else return(1)
}
int E1()/*E’*/ // E'→+TE'
{ int f
if(ch=='+') {
b[i1]=ch
ch=a[++i1]
f=T()
if (f==0) return(0)
E1()
return(1)
}
return(1)
}
int T1()/*T’*/ // T'→*FT'
{
int f,t
if(ch=='*') {
b[i1]=ch
ch=a[++i1]
f=F()
if (f==0) return(0)
t=T1()
if (t==0) return(0)
else return(1)}
a[i1]=ch
return(1)
}
int F() // F→(E)
{ int f
if(ch=='(') {
b[i1]=ch
ch=a[++i1]
f=E()
if (f==0) return(0)
if(ch==')') {
b[i1]=ch
ch=a[++i1]
}
else {
printf("error\n")
return(0)
}
}
else if(ch=='i') {
b[i1]=ch
ch=a[++i1]
}
else {printf("error\n")return(0)}
return(1)
}
先做个LL(1)或者LALR的语法分析器,然后先把教材上的几个LL(1)的例子调通过。然后网上有C语言子集的文法,有人做了转成大小写这样的表述。通过那个的测试就差不多了。。。。其实做语法分析也没多大用编译器的难点在于语法制导、代码优化之类的,真要做C语言的完整编译器,普通的学生都几乎不可能实现。。。。就不多说了
你可以动手开始做了
如果你有较强的程序设计能力,做个漂亮的LR(1)分析器还是可以的,实在不会就做SLR(1)这样的分析器,如果程序设计能力比较差,建议先做LL(1),那个比较好做。码字不易,望采纳!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)