河北工業大學編譯原理實驗
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...