編譯原理語義分析(文字輸入)源程式

2021-07-03 21:10:00 字數 3302 閱讀 5402

#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 圓括號 下標運算子 分量運算子的指向結構體成員運算子 結構體成員運...