编译递归下降分析法

编译递归下降分析法,第1张

#include <stdio.h>

#include<dos.h>

#include<stdlib.h>

#include<string.h>

char a[50] ,b[50],d[200],e[10]

char ch

int n1,i1=0,flag=1,n=5

int E()

int E1()

int T()

int G()

int S()

int F()

void input()

void input1()

void output()

void main() /*递归分析*/

{

int f,p,j=0

char x

d[0]='E'

d[1]='='

d[2]=''

d[3]='T'

d[4]='G'

d[5]='#'

printf("请输入字符串(长度<50,以#号结束)\n")

do{

scanf("%c",&ch)

a[j]=ch

j++

}while(ch!='#')

n1=j

ch=b[0]=a[0]

printf("文法\t分析串\t\t分析字符\t剩余串\n")

f=E1()

if (f==0) return

if (ch=='#')

{ printf("accept\n")

p=0

x=d[p]

while(x!='#') {

printf("%c",x)p=p+1x=d[p] /*输出推导式*/

}

}

else {

printf("error\n")

printf("回车返回\n")

getchar()getchar()

return

}

printf("\n")

printf("回车返回\n")

getchar()

getchar()

}

int E1()

{ int f,t

printf("E--TG\t")

flag=1

input()

input1()

f=T()

if (f==0) return(0)

t=G()

if (t==0) return(0)

else return(1)

}

int E()

{ int f,t

printf("E--TG\t")

e[0]='E'e[1]='='e[2]=''e[3]='T'e[4]='G'e[5]='#'

output()

flag=1

input()

input1()

f=T()

if (f==0) return(0)

t=G()

if (t==0) return(0)

else return(1)

}

int T()

{ int f,t

printf("T--FS\t")

e[0]='T'e[1]='='e[2]=''e[3]='F'e[4]='S'e[5]='#'

output()

flag=1

input()

input1()

f=F()

if (f==0) return(0)

t=S()

if (t==0) return(0)

else return(1)

}

int G()

{ int f

if(ch=='+') {

b[i1]=ch

printf("G--+TG\t")

e[0]='G'e[1]='='e[2]=''e[3]='+'e[4]='T'e[5]='G'e[6]='#'

output()

flag=0

input()input1()

ch=a[++i1]

f=T()

if (f==0) return(0)

G()

return(1)

}

printf("G--^\t")

e[0]='G'e[1]='='e[2]=''e[3]='^'e[4]='#'

output()

flag=1

input()input1()

return(1)

}

int S()

{

int f,t

if(ch=='*') {

b[i1]=chprintf("S--*FS\t")

e[0]='S'e[1]='='e[2]=''e[3]='*'e[4]='F'e[5]='S'e[6]='#'

output()

flag=0

input()input1()

ch=a[++i1]

f=F()

if (f==0) return(0)

t=S()

if (t==0) return(0)

else return(1)}

printf("S--^\t")

e[0]='S'e[1]='='e[2]=''e[3]='^'e[4]='#'

output()

flag=1

a[i1]=ch

input()input1()

return(1)

}

int F()

{ int f

if(ch=='(') {

b[i1]=chprintf("F--(E)\t")

e[0]='F'e[1]='='e[2]=''e[3]='('e[4]='E'e[5]=')'e[6]='#'

output()

flag=0

input()input1()

ch=a[++i1]

f=E()

if (f==0) return(0)

if(ch==')') {

b[i1]=chprintf("F--(E)\t")

flag=0input()input1()

ch=a[++i1]

}

else {

printf("error\n")

return(0)

}

}

else if(ch=='i') {

b[i1]=chprintf("F--i\t")

e[0]='F'e[1]='='e[2]=''e[3]='i'e[4]='#'

output()

flag=0input()input1()

ch=a[++i1]

}

else {printf("error\n")return(0)}

return(1)

}

void input()

{

int j=0

for (j<=i1-flagj++)

printf("%c",b[j]) /*输出分析串*/

printf("\t\t")

printf("%c\t\t",ch) /*输出分析字符*/

}

void input1()

{

int j

for (j=i1+1-flagj<n1j++)

printf("%c",a[j])/*输出剩余字符*/

printf("\n")

}

void output(){ /*推导式计算*/

int m,k,j,q

int i=0

m=0k=0q=0

i=n

d[n]='='d[n+1]=''d[n+2]='#'n=n+2i=n

i=i-2

while(d[i]!=''&&i!=0) i=i-1

i=i+1

while(d[i]!=e[0]) i=i+1

q=i

m=qk=q

while(d[m]!='') m=m-1

m=m+1

while(m!=q) {

d[n]=d[m]m=m+1n=n+1

}

d[n]='#'

for(j=3e[j]!='#'j++){

d[n]=e[j]

n=n+1

}

k=k+1

while(d[k]!='=') {

d[n]=d[k]n=n+1k=k+1

}

d[n]='#'

}

这是我们用到的程序,看看对你有没有帮助。

至于下面的两个问题,很简单,可以容易做出来吧!

不会可以和我交流!

祝 进步!

兄弟,其实这个问题不难,只是我感觉你给的问题不完全,不知道怎么给你解决,要不我给你个递归下降分析方法分析文法的例子吧,你先看看。我估计你看了这个后绝对就明白整体的分析思想了~

文法如下:

S->do s1 begin s2 end while s2

s1->s2mB

s2->AmB

A->B

B->VAL //VAL是所有非关键字的字符字符组和数字

m->+|-|*|/|>|<|=

/////////////*语法递归分析*/////////////////

int B(int * c,int &q)

{

if(c[q]==13)

{ q++

return 1

}

else if(c[q]==5)

{ q++

return 1

}

else {cout<<"error 'B'"<<endlreturn 0}

}

int A(int * b,int &o)

{

if(B(b,o))

{

return 1

}

else {cout<<"error 'A'"<<endlreturn 0}

}

int OP(int *r,int &v)

{

if(r[v]==6)

{

v++

return 1

}

else if(r[v]==7)

{

v++

return 1

}

else if(r[v]==8)

{

v++

return 1

}

else if(r[v]==9)

{

v++

return 1

}

else if(r[v]==10)

{

v++

return 1

}

else if(r[v]==11)

{

v++

return 1

}

else if(r[v]==12)

{

v++

return 1

}

else {cout<<"error 'OP'"<<endlreturn 0}

}

int S2(int * d,int &h)

{

if(A(d,h))

{

if(OP(d,h))

{

if(B(d,h))

return 1

else {cout<<"条件语句右部出错 "<<endlreturn 0}

}

else {cout<<"条件语句缺少运算符 "<<endlreturn 0}

}

else {cout<<"条件语句左部出错 "<<endlreturn 0}

}

int S1(int * d,int &h)

{

if(S2(d,h))

{

if(OP(d,h))

{

if(B(d,h))

return 1

else {cout<<"循环语句右部出错 "<<endlreturn 0}

}

else {cout<<"循环语句缺少运算符 "<<endlreturn 0}

}

else {cout<<"循环语句左部出错 "<<endlreturn 0}

}

int S(int *a,int &z)

{

if (a[z++]==1)

{

if (S1(a,z))

{

if (a[z++]==2)

{

if (S2(a,z))

{

if(a[z++]==3)

{

if(a[z++]==4)

{

if(S2(a,z))

{

cout<<"语法分析成功!"<<endl

return 1

}

else return 0

}

else {cout<<"error 'while'"<<endlreturn 0}

}

else {cout<<"error 'end'"<<endlreturn 0}

}

else return 0

}

else {cout<<"error 'begin'"<<endlreturn 0}

}

else return 0

}

else {cout<<"error 'do'"<<endlreturn 0}

}

/////////////////////// 语法分析结束 ////////////////////////

词法分析中单词代号 词法分析中可识别到的所有单词

1 do

2 begin

3 end

4 while

5 除关键字以外的所有字符或字符串

6 +

7 -

8 *

9 /

10 =

11 >

12 <

13 数字

14 结束标识符“#”

自己好好琢磨琢磨吧,其实思想挺简单的~

# include <iostream>

# include <cstdlib>

# include <cctype>

# include <csetjmp>

// Error jmp_buf buffer

static std::jmp_buf errjb

// Function prototypes.

int addsubt()

int multdiv()

int number()

void error()

// Global expression buffer.

static char expr[81]

static int pos

////////////////////////////

// The main() function. //

///////////////////////////

int main()

{

int ans

do

{

// Mark the top of the parsing descent.

if(setjmp(errjb) == 0)

{

// Initialize the string subscript.

pos = 0

// Read an expression.

std::cout <<"Enter expression(0 to quit):" <<std::endl

std::cin >>expr

// Evaluate the expression.

ans = addsubt()

if(expr[pos] != '\0')

error()

if(ans != 0)

std::cout <<ans <<std:endl

}

else

{

// An error occurred.

std::cout <<"Try again" <<std::endl

ans = 1

}

}

while(ans != 0)

return 0

}

///////////////////////////////////////////////////

// Top of recursive descent: add/subtract. //

//////////////////////////////////////////////

int addsubt()

{

int rtn = multdiv()

while(expr[pos] == '+' || expr[pos] == '-')

{

int op = expr[pos++]

int opr2 = multdiv()

if(op == '+')

rtn += opr2

else

rtn -= opr2

}

return rtn

}

////////////////////////////////////////////

// Highest precedence: multiply/divide. //

///////////////////////////////////////////

int multdiv()

{

int rtn = number()

while(expr[pos] == '*' || expr[pos] == '/')

{

int op = expr[pos++]

int opr2 = number()

if(op == '*')

rtn *= opr2

else

rtn /= opr2

}

return rtn

}

/////////////////////////

// Extract a number //

///////////////////////

int number()

{

int rtn

if(expr[pos] == '(')

{

// Parenthetical expression.

pos++

rtn = addsubt() // Back to top.

if(expr[pos++] != ')') // Must have ')'

error()

return rtn

}

// Extract the number.

if(!isdigit(expr[pos]))

error

rtn = atoi(expr + pos)

while(isdigit(expr[pos]))

pos++

return rtn

}

////////////////////////

// Syntax error. //

//////////////////////

void error()

{

std::cout <<'\r'

while(pos--)// Position error pointer.

std::cout <<' '

std::cout <<"A syntax error" <<std::endl <<'\a'

// Return to the top of the program.

std::longjmp(errjb,1)

}

}


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

原文地址: http://outofmemory.cn/yw/11825759.html

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

发表评论

登录后才能评论

评论列表(0条)

保存