#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)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)