91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

資源簡介

了解用算符優先法對表達進行語法分析的方法,掌握自頂向下的預測語法分析程序的手工構造方法。 附加功能: 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(

評論

共有 條評論