资源简介

了解用算符优先法对表达进行语法分析的方法,掌握自顶向下的预测语法分析程序的手工构造方法。 附加功能: 1. 循环输入表达式和输出结果 2. 输出表达式对应的后缀表达式

资源截图

代码片段和文件信息

#include “stdio.h“
#include “string.h“
#include “ctype.h“
#include “malloc.h“

#define N 1000

typedef struct input *Pin;//表达式链结点
struct input
{
int info;//数字用数值存储,符号用对应的ASCII码存储
int type;//标记:0为数字,1为符号
Pin next;
}head;


typedef struct node *pnode;//栈结点
struct node
{
    int info;   //结点内容
    pnode next; 
};

struct linkStack
{
pnode top;
};
typedef struct linkStack * PlinkStack;

PlinkStack OPTROPND;//符号栈、数值栈
Pin E;
Pin now;
char in[N];

int top(PlinkStack plstack);//取栈顶元素
void push(PlinkStack plstackint n);//入栈
int pop(PlinkStack plstack);//出栈
int signature(int n);//符号处理模块
int transform(int c);//将运算符转换成符号分析表中的坐标
int cmp(int iint j);//查符号分析表,返回优先级
int less(Pin E);//符号表小于操作
int equal(Pin E);//符号表等于操作
int greater(Pin E);//符号表大于操作
void change();////将输入字符串转化为链表,在输入表达式前后各加一个#
void start();//获得输入字符,检测其合法性
Pin provide();//每次调用时返回一个结点

int main()
{
int flag1=1flag2=1tempvalue;
OPND = (struct linkStack *) malloc (sizeof(struct linkStack));
OPTR = (struct linkStack *) malloc (sizeof(struct linkStack));

while(flag1)//控制可以循环输入表达式
{
flag2 = 1;
OPND->top = NULL;
OPTR->top = NULL;
push(OPTR‘#‘);

start();//获得输入字符,检测其合法性
printf(“后缀表达式:“);

while(flag2!=0)
{
E=provide();//获得一个结点,数字/符号
if(E->type==0)//数字处理
{
printf(“%d “E->info);//输出后缀式子控制
push(OPNDE->info);
}
else if(E->type==1)//符号处理
{
temp=signature(E->info);
if(temp == 1)
{
value = pop(OPND);//表达式的值
flag2=0;
}
}
else
{
printf(“无法获得结点信息!\n“);
}
}
printf(“\n表达式的值为:%d\n“value);
printf(“\n“);
}
}


void start()//获得输入字符,检测其合法性
{
head.next=NULL;
now=&head;
int i;
int len;
bool pass=true;
int flag=0;

while(pass)
{
printf(“请输入表达式:“);
scanf(“%s“in);

len=strlen(in);

for(i=0;i {
if((in[i]>=‘0‘&&in[i]<=‘9‘)||(in[i]==‘+‘)||(in[i]==‘-‘)||(in[i]==‘*‘)||(in[i]==‘/‘)||(in[i]==‘(‘)||(in[i]==‘)‘))
{
if(!(in[i]>=‘0‘&&in[i]<=‘9‘)&&!(in[i+1]>=‘0‘&&in[i+1]<=‘9‘))
{
if(!(in[i]==‘)‘||in[i+1]==‘(‘))
{
flag=1;
printf(“表达式有误!\n\n“);
}
if(in[i]==‘)‘&&in[i+1]==‘(‘)
{
flag=1;
printf(“表达式有误!\n\n“);
}
}
else if((in[i]>=‘0‘&&in[i]<=‘9‘&&in[i+1]==‘(‘)||(in[i]==‘)‘&&in[i+1]>=‘0‘&&in[i+1]<=‘9‘))
{
flag=1;
printf(“表达式有误!\n\n“);
}
}
else
{
flag=1;
printf(“错误:非法字符!\n\n“);
}
}
if(flag==1)
{
flag=0;
pass=true;
}
else
pass=false;
}
change();
}

void change()//将输入字符串转化为链表,在输入表达式前后各加一个#
{
int num=0;
char *p*q;
p=&in[0];
q=&in[1];

while(*p!=‘\0‘)
{
if(*p>=‘0‘&&*p<=‘9‘)
{
num=num*10+(*p-‘0‘);
if(

评论

共有 条评论