急急急,编译原理

急急急,编译原理,第1张

using namespace std

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),那个比较好做。码字不易,望采纳!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12064939.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存