这里有一个c语言的语法分析程序,该怎么使用,我想得到它的语法树,然后在上面提取循环语句信息?

Python016

这里有一个c语言的语法分析程序,该怎么使用,我想得到它的语法树,然后在上面提取循环语句信息?,第1张

在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。和抽象语法树相对的是具体语法树(concrete syntaxtree),通常称作分析树(parse tree)。一般的,在源代码的翻译和编译过程中,语法分析器创建出分析树。一旦AST被创建出来,在后续的处理过程中,比如语义分析阶段,会添加一些信息。

先做个LL(1)或者LALR的语法分析器,然后先把教材上的几个LL(1)的例子调通过。然后网上有C语言子集的文法,有人做了转成大小写这样的表述。通过那个的测试就差不多了。。。。其实做语法分析也没多大用 编译器的难点在于语法制导、代码优化之类的,真要做C语言的完整编译器,普通的学生都几乎不可能实现。。。。就不多说了 你可以动手开始做了 如果你有较强的程序设计能力,做个漂亮的LR(1)分析器还是可以的,实在不会就做SLR(1)这样的分析器,如果程序设计能力比较差,建议先做LL(1),那个比较好做。码字不易,望采纳!

这个是精简的语法分析程序,如果符合的话,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)

}