?? 算符優先分析.cpp
字號:
// 算符優先分析.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "parser.h"
/**************
文法G[E]描述:
E→E+T∣E-T∣T
T→T*F∣T/F∣F
F→(E)∣i
**************/
/*************算符優先關系表************/
/* | + - * / ( ) i # */
/*--|---------------------------------*/
/* +| > > < < < > < > */
/* -| > > < < < > < > */
/* *| > > > > < > < > */
/* /| > > > > < > < > */
/* (| < < < < < = < */
/* )| > > > > > > */
/* i| > > > > > > */
/* #| < < < < < < = */
/*-------------------------------------*/
//讀入實驗一中的二元式文件內容并完成轉換
void ReadBuff()
{
char in[20];
FILE *infile;
do{
printf("\n請輸入需要分析的源文件路徑:");
scanf("%s",&in);
infile = fopen(in, "r");
if(infile==NULL)
printf("\n出錯:未找到源文件,請再次輸入源文件路徑!\n\n");
}while(infile==NULL);
int id = 0, i = 0;
char b[20];
do{
fgets(b,20,infile);
char *cc;
cc = strtok(b,",");
id = atoi(cc);
switch(id){ //標號轉換過程
case 12:
case 13:
a[i++] = 'i';
break;
case 25:
a[i++] = '/';
break;
case 26:
a[i++] = '+';
break;
case 27:
a[i++] = '-';
break;
case 28:
a[i++] = '*';
break;
case 30:
a[i++] = '(';
break;
case 31:
a[i++] = ')';
break;
default:
break;
}
}while(id != 0 && i <= 50);
printf("\n轉換為文法對應形式:%s\n\n",a);
int n = strlen(a);
a[n++] = '#';
}
//打印分析過程
void printStep(int step, int k, char NewVn, char cc[])
{
printf("%3d",step);
printf("\t\t");
for(int m=0; m<=k; m++)
printf("%c",stack[m]);
if(m>8)
printf("\t%s",cc);
else
printf("\t\t%s",cc);
printf("\t\t\t%c",NewVn);
printf("\n");
}
//算符優先分析過程
bool parser()
{
// printf("輸入字符:");
// scanf("%s",a);
//讀入二元式文件并完成轉換
ReadBuff();
int i,k; //i:當前分析字符的下標位置,k:比較字符在棧的下標位置
char NewVn; //NewVn:規約產生式形成的左部
char r; //r:當前分析的字符
int step; //step:當前分析的步驟數
i = 0;
k = 0;
step = 0;
stack[0] = '#';
char cc[10] = ""; //cc:記錄規約的產生式右部
printf("步驟 分析棧內容 當前規約的最左子串 規約所得到符號\n");
do{
int j;
r = a[i++]; //r指向輸入串中正在分析的字母
if(IsVt(stack[k])) //如果當前棧頂是終結符
j = k; //取棧頂元素
else
j = k-1; //取棧頂下一元素
while((stack[j] != '#') && (IsHigherThan(stack[j],r))) //歸約到不能再歸約
{
char q;
do{
q = stack[j];
if(IsVt(stack[j-1]))
j--;
else
j-=2;
}while(!IsLowerThan(stack[j],q));//從棧頂向下找到最左素短語
//將stack[j+1]stack[j+2]...stack[k]進行歸約
NewVn = Reduce(j+1,k,k-j);
for(int l=0; l<k-j; l++)
cc[l] = stack[j+1+l];
cc[l] = '\0';
if(NewVn == ' ')
return ERROR;
k = j+1;
stack[k] = NewVn;
step++;
printStep(step,k,NewVn,cc);
NewVn = ' ';
}/*while*/
if(IsLowerThan(stack[j],r) || IsEqualTo(stack[j],r))
{
k++;
stack[k] = r; //當前分析字符入棧
}
else
return ERROR;
}while(r != '#');
step++;
printf("%3d",step);
printf("\t\t");
for(int m=0; m<=k; m++)
printf("%c",stack[m]);
printf("\t\t分析成功");
printf("\n");
return SUCCESS;
}
int main(int argc, char* argv[])
{
int c=0;
printf("************************\n");
printf("************************\n");
printf("------------------------\n");
printf("************************\n");
printf("** <文法描述> **\n");
printf("** 1:E→E+T∣E-T∣T **\n");
printf("** 2:T→T*F∣T/F∣F **\n");
printf("** 3:F→(E)∣i **\n");
printf("************************\n");
do{
printf("\n請選擇:1-> 算符優先分析 2-> 退出\n");
scanf("%d",&c);
if(c==1){
if(parser())
printf("\n分析結果:輸入串合法!\n");
else
printf("\n分析結果:輸入串非法!\n");
}else if(c==2)
break;
else printf("\n請選擇正確選項!\n");
}while(true);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -