#include
#include
#include
#include
#include
struct quad
; struct quad quad[30];
int count=0;
char *expression(void);
char prog[200],token[9];//function長度為8,加上'\0',所以陣列最小大小應該為9
char ch;
int syn,p,m,n,sum=0;
int kk=0,k=0;
char *rwtab[6]=;
//資料單位:eg:123,ad,(,*,+,a1;
void scaner()
//字串
token[m++]='\0';
p--;//使得prog[p]被ch讀入的最後乙個字元
syn=10;//用來區分輸入資料型別
for(n=0;n<6;n++) }
} else if(ch>='0' && ch<='9')//讀入第乙個資料為數字(讀入為數字,直接經過sum運算,結果存放在sum中)
p--;//使得prog[p]被ch讀入的最後乙個數字
syn=11;//若為數字,則,syn為11
} else switch(ch)//讀入第乙個資料為運算子(運算子先存放在token陣列中)
else//<
break;
case '>':
m=0;token[m++]=ch;
ch=prog[++p];
if(ch=='=')
else
break;
case '=':
m=0;token[m++]=ch;
ch=prog[++p];
if(ch=='=')
else
break;
case '!':
m=0;token[m++]=ch;
ch=prog[++p];
if(ch=='=')
else syn=-1;
break;
case '+':syn=13;token[0]=ch;break;
case '-':syn=14;token[0]=ch;break;
case '*':syn=15;token[0]=ch;break;
case '/':syn=16;token[0]=ch;break;
case ';':syn=26;token[0]=ch;break;
case '(':syn=27;token[0]=ch;break;
case ')':syn=28;token[0]=ch;break;
case '#':syn=0;token[0]=ch;break;
default:syn=-1; }}
/*該函式的功能是生成乙個三位址語句送到四元式表中。*/
void emit(char *result,char *ag1,char *op,char *ag2)
/*該函式回送乙個新的臨時變數名,臨時變數名產生的順序為t1,t2,…*/
char *newtemp()
/*factor函式,檢查是否識別符號,如果是,呼叫scaner函式,
如果不是,檢查是否是數值,
如果是,呼叫scaner函式,
如果不是,檢查是否是'(',
如果不是,進行出錯處理,
如果是,呼叫scaner函式,再呼叫expression()函式,返回後檢查是否是')',
如果不是,進行出錯處理,如果是,呼叫scaner函式,返回*/
char *factor(void)
else if(syn==11)//該資料單位為數字
else if(syn==27)//該資料單位為( }
else
return (fplace);//返回資料單位的內容,如果是(,則返回(後面乙個資料單位的內容
}/*term()函式的作用是判斷輸入的是否是由'*''/'連線成的因式,並將對應的四元式儲存並輸出*/
char *term(void)
else if(syn==16)//如果為'/'
scaner();//獲取下乙個資料單位
strcpy(ep2,factor());//呼叫factor()函式,並將函式返回值賦值給ep2(字串,數字,'(',出錯)
strcpy(tp,newtemp());//呼叫newtemp()函式,將該函式返回值賦值給tp,tp為臨時變數名
emit(tp,eplace,tt,ep2);//呼叫emit函式,生成乙個三位址語句存放在四元式表中
strcpy(eplace,tp);//eplace為四元式
}return(eplace);
}char *expression(void)
else if(syn==14)
scaner();
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
} return(eplace);//返回對應四元式的值
} int statement()
else
break;
} return(schain);
} int yucu()
return(schain);
} int lrparser()
else }
} else
return(schain);
} void main()
dowhile(ch!='#'); //將輸入字串賦值到prog陣列
p=0; //使得ch從第乙個字元開始獲取
printf("種別碼 單詞符號\n");
do }while(syn!=0);//讀入所有輸入的資料(只是判斷輸入資料是否正確,並沒有進行語法,語義分析操作)
printf("詞法分析成功,按任意鍵進行語法、語義分析");
getch();//按任意鍵,程式往下執行
p=0;//詞法分析後,重新對ch賦值,使得ch從第乙個字元開始獲取
scaner();//掃瞄第乙個單位,判斷其型別
lrparser();//將將第乙個輸入字串翻譯為四元式
if(kk!=0)
printf("\n三位址指令如下:\n");
for(i=0;igetch();
return;
}
編譯原理語義分析 編譯原理 語義分析和符號表
本文使用 zhihu on vscode 創作並發布經過詞法分析 語法分析之後,源程式形式上和結構上的正確性基本得到了保證。然而,僅有形式上的正確性,並不能保證源程式就是完全正確的,還要檢查源程式的含義是否正確。諸如符號的使用是否得當,表示式的型別是否相容等,完成這些功能的編譯階段稱為語義分析。語義...
編譯原理之語義分析
見語法制導翻譯篇 語義是指源程式及其組成部分所表述的含義 和語法不同,語法是關於程式及其組成部分的構成規則的描述,是上下文無關的 而語義是關於語法結構的含義及其使用規則的描述,是上下文有關的。語法上正確,其語義不一定正確。語義分析與中間 生成器基於語義規則,對語法樹進行語義分析 變數是否定義,型別是...
編譯原理 語義分析題型
字尾式 又稱逆波蘭表示法,把運算量 運算元 寫在前面,把算符寫在後面 字尾 如 a b 寫成 ab a b c 寫成 abc 字尾式要注意的是運算符號優先順序 c語言中運算子優先順序排序如下 優先順序 高到低 分為優先順序15級 1 圓括號 下標運算子 分量運算子的指向結構體成員運算子 結構體成員運...