河工大編譯原理

2021-10-10 12:14:36 字數 4531 閱讀 1529

河北工業大學編譯原理實驗

c++/c

詞法分析

```cpp

# include # include # include #include #include#define begin 1

#define end 2

#define if 3

#define then 4

#define else 5

#define for 6

# define id 7 //識別符號

# define lt 8 //小於

# define le 9 //小於等於

# define eq 10 //等於

# define ne 11 //不等於

# define gt 12 //大於

# define ge 13 //大於等於

# define is 14 //賦值

# define pl 15 //加

# define mi 16 //減

# define mu 17 //乘

# define di 18 // 除

char token[20];//依次存放乙個單詞英文中的各個字元

char to[20]; //存放下乙個要分析的單詞

int lookup (char*);//以token中的字串查保留字表

void out(int, char*);//輸出函式

void report_error ();//報告出錯

void scanner_example (file *);//遍歷檔案查詢

int handleotherword (void);//處理出錯

#define chushi 0

#define digit 1

#define point 2

#define other 3

#define power 4

#define plus 5

#define minus 6

#define ucon 7 //無符號數常量的類號是7

#define classother 200

#define endstate -1

int w,n,p,e,d,j;

int icon;

int row=1;

int class;//用來表示單詞的等級

float fcon;

static int currentstate;//用來表示當前狀態,初始狀態值為0

int getchar (int c);

int excute (int,int);

int lex (void);

//建立保留字表

#define max_key_number 20 //關鍵字的數量

#define key_word_end "waiting for your expanding" //關鍵字結束標記

char *keywordtable[max_key_number]=;//保留字表

//查保留字表,判斷是否為關鍵字

int lookup(char* token)

n++;

} return 0;//單詞不是關鍵字,而是識別符號

}int handleotherword (void)

//報錯函式

int handleerror (void)

//主函式,開啟並讀檔案

void main(void)

dowhile(fgetc(fp)!=eof);

fclose(fp);//關閉檔案

}void scanner_example (file *fp)

token[i]= '\0';//結束token

to[i]='\0';

fseek(fp,-1,1); // retract fseek函式 每呼叫一次,就把掃瞄指示器回退乙個字元位置(即退回多讀的那個字元)

//fp為檔案指標,-1:為偏移量,正數表示正向偏移,負數表示負向偏移;1:設定從檔案的**開始偏移,可能取值為:seek_cur、 seek_end 或 seek_set

//seek_set: 檔案開頭seek_cur: 當前位置 seek_end: 檔案結尾其中seek_set, seek_cur和seek_end依次為0,1和2.

//指標退回到離檔案當前位置1位元組處

//保留字

c=lookup(token);//檢查token中的字串是否為保留字,若有則將相應的關鍵字的類別碼賦給c,否則c=0

if (c==0)

else

out (c," "); //說明為關鍵字

if(ch==eof)//檔案讀完,跳出迴圈

}//判斷是否為「無符號數」

else if (isdigit(ch)||ch=='.') //當第乙個字元為數字時 當ch為數字0-9時,返回非零值,否則返回零

if(j==0)

else if(j==3)

else if(j==4)

else

if(ch==eof)//結束

}//判斷第乙個字元是否為運算子

else

switch(ch)

else if(ch=='>')

else

else

fseek (fp,-1,1); //返回上乙個字元

}break;

case '=':

out(eq, " "); // =

to[i]='\0';

break;

case ':':

ch=fgetc(fp);

if(ch=='=')

else if(ch==eof)

else

else

}break;

case'>':

ch=fgetc(fp);

if(ch=='=')

else

else fseek (fp,-1,1);//返回乙個字元

}break;

case'+':

to[i]=ch;

i++;

to[i]='\0';

out(pl," ");break;

case'-':

to[i]=ch;

i++;

to[i]='\0';

out(mi," ");break;

case'*':

to[i]=ch;

i++;

to[i]='\0';

out(mu," ");break;

case'/':

to[i]=ch;

i++;

to[i]='\0';

out(di," ");break;

case' ':

break;

case'\n':

row++;

break;

default: report_error(); //報告出錯位置

break;

} ch=fgetc(fp);

} return;

}/*輸出函式*/

void out(int c,char*v)

fprintf(fpt,"(%s,%s)\n",cl,v);

fclose(fpt);

}void report_error()

//每呼叫一次,就把掃瞄指示器當前所指示的源程式字元送入字元變數ch,然後把掃瞄指示器前推乙個字元位置。

int getchar (int c)

if (c=='.')

return point;//返回點

if (c=='e'||c=='e')

return power;//返回給定數字的乘冪

if (c=='+')

return plus;

if (c=='-')

return minus;

return other;

}//識別無符號數

int excute (int state, int symbol)//狀態和digit這種標誌

break;

case 1:

switch (symbol)

break;

case 2:

switch (symbol)

break;

case 3:

switch (symbol)

break;

case 4:

switch (symbol)

break;

case 5:

switch (symbol)

break;

case 6:

switch (symbol)

break;

} return currentstate;

}

南工大 編譯原理實驗

南工大 編譯原理實驗 一 上機實習目的 理解編譯程式的構造原理,掌握編譯程式的構造方法與技術。通過實習,使學生既加深對編譯原理基礎理論的理解,又提高動手能力,特別是提高軟體設計能力。二 上機實習要求 在理解編譯原理基本思想的基礎上,選擇乙個自己熟悉的程式語言,完成編譯程式的設計和實現過程。本上機實習...

合工大 編譯原理 實驗三

合工大 編譯原理 實驗三 lr 1 分析法 本專案使用c 實現,利用windows api製作了簡易的ui介面。具體功能如下 支援檢視文法,專案族,lr 1 分析表,句子歸約過程。可使用包含左遞迴的文法且在過程中不生成新終結符 利用graphviz檢視dfa轉換圖 詳細功能 示例截圖 專案 請見gi...

編譯原理 哈工大編譯原理課程內容記錄

第二章 語言,文法,上下文無關法 串上的運算 xy string x string y 字串a的正閉包 不含0次方冪 字串a的閉包 又稱克林閉包 含0次方冪 0次方冪有個特殊的符號 文法的型別 第一種上下文有關 csg context sensitive grammer 第二種上下文無關 csg c...