詞法分析程式(lexical
analyzer)要求:
- 從左至右掃瞄構成源程式的字元流
- 識別出有詞法意義的單詞(lexemes)
- 返回單詞記錄(單詞類別,單詞本身)
- 濾掉空格
- 跳過注釋
- 發現詞法錯誤
程式結構:
輸入:字元流(什麼輸入方式,什麼資料結構儲存)
處理:–遍歷(什麼遍歷方式)
–詞法規則
輸出:單詞流(什麼輸出形式)
–二元組
單詞類別:
1.識別符號(10)
2.無符號數(11)
3.保留字(一詞一碼)
4.運算子(一詞一碼)
5.界符(一詞一碼)
單詞符號
種別碼單詞符號
種別碼begin
ifthen
while
doend
l(l|d)*
dd*#include
#include
#include
#include
#include
#define maxsize 50
int i, row = 0, line = 0;
char a[1000]; //程式
int number[1000][100]; //常數表
char mark[100][5]; //識別符號表
char file,file1;
file fp,fwp;
//詞法分析
int wordanalysis()
; int n = 0;
word[n++] = a[i++];
//若字元為az或09,則繼續讀取
while ((a[i] >= 'a'&&a[i] <= 'z') || (a[i] >= '0' && a[i] <= '9')||(a[i]>='a'&&a[i]<='z'))
word[n] ='\0';
//i-;
//判斷該識別符號是否為保留字
for (n = 0; n < 100; n++)
} //判斷識別符號長度是否超出規定
if (strlen(word)>10)
//判斷該識別符號是否存在識別符號表中
int m = 0;
if (line != 0)
x[n] = '\0';
i-;int num = atoi(x); //將字串轉換成int型
//判斷該常數是否存在於常數表中
if (row != 0)
if (num == sum)}}
int z = num, c = num;
int m = 0;
do //計算是幾位二進位制數
while (z != 0);
for (n = m; n > 0; n-) //將二進位制儲存於常數表中
number[row][0] = m;
int line = row;
printf("( %d,%d ) 數字\n", line + 1,num);
fprintf(fwp,"( %d,%d ) 數字\n", line + 1,num);
row++;
return 3;
} else //分析符號
switch (a[i])
else if (a[i] == '>')
else
case '>':
i++;
if (a[i] == '=')
else
case '+': printf("( 20,+ ) 運算子\n"); fprintf(fwp,"( 20,+ ) 運算子\n"); return 3;
case '-': printf("( 21,- ) 運算子\n");fprintf(fwp,"( 21,- ) 運算子\n"); return 3;
case ' ': printf("( 22, ) 運算子\n"); fprintf(fwp,"( 21, ) 運算子\n"); return 3;
case '/':
i++;
if(a[i]!='/')
else
printf("( 35,// ) 界符\n");fprintf(fwp,"( 35,// ) 界符\n");return 3;
}case ':': printf("( 24,: ) 界符\n");fprintf(fwp,"( 24,: ) 界符\n"); return 3;
case ';': printf("( 25,; ) 界符\n");fprintf(fwp,"( 25,; ) 界符\n"); return 3;
case '(': printf("( 26,( ) 界符\n");fprintf(fwp,"( 26,( ) 界符\n"); return 3;
case ')': printf("( 27,) ) 界符\n");fprintf(fwp,"( 27,) ) 界符\n"); return 3;
case '': printf("( 29,} ) 界符\n");fprintf(fwp,"( 29,} ) 界符\n"); return 3;
case '[': printf("( 30,[ ) 界符\n");fprintf(fwp,"( 30,[ ) 界符\n"); return 3;
case ']': printf("( 31,] ) 界符\n");fprintf(fwp,"( 31,] ) 界符\n"); return 3;
case '|': printf("( 32,| ) 運算子\n");fprintf(fwp,"( 32,| ) 運算子\n"); return 3;
case '!': printf("( 33,! ) 界符\n");fprintf(fwp,"( 33,! ) 界符\n"); return 3;
case ',': printf("( 34, ) 界符\n");fprintf(fwp,"( 34, ) 界符\n"); return 3;
case '~': printf("( 35,~ ) 運算子\n");fprintf(fwp,"( 35,~ ) 運算子\n"); return 3;
case '&':
i++;
if(a[i]!='&')
else
//case '\': printf("( 39,\ ) 界符\n");fprintf(fwp,"( 39,\ ) 界符\n"); return 3;
}fclose(fwp);
}int main()
else
printf("請輸入詞法分析結果要存放的檔名(含路徑):");
gets(file1);
if(!(fwp=fopen(file1,"w")))
else
a[l] = '#';
do} while (m != 0);
}return 0;
}**太難了
詞法分析程式的設計與實現
詞法分析程式 lexical analyzer 要求 從左至右掃瞄構成源程式的字元流 識別出有詞法意義的單詞 lexemes 返回單詞記錄 單詞類別,單詞本身 濾掉空格 跳過注釋 發現詞法錯誤 程式結構 輸入 字元流 什麼輸入方式,什麼資料結構儲存 處理 遍歷 什麼遍歷方式 詞法規則 輸出 單詞流 ...
05 詞法分析程式的設計與實現 10 10
詞法分析程式 lexical analyzer 要求 從左至右掃瞄構成源程式的字元流 識別出有詞法意義的單詞 lexemes 返回單詞記錄 單詞類別,單詞本身 濾掉空格 跳過注釋 發現詞法錯誤 程式結構 輸入 字元流 什麼輸入方式,什麼資料結構儲存 處理 遍歷 什麼遍歷方式 詞法規則 輸出 單詞流 ...
編譯原理5 詞法分析程式的設計與實現
編譯原理5 詞法分析程式的設計與實現 此程式要逐個檢查運 況,並能當場補全 詞法分析程式 lexical analyzer 要求 從左至右掃瞄構成源程式的字元流 識別出有詞法意義的單詞 lexemes 返回單詞記錄 單詞類別,單詞本身 濾掉空格 跳過注釋 發現詞法錯誤 程式結構 輸入 字元流 什麼輸...