程序編譯過程由詞法分析、語法分析、語義分析、中間代碼生成、代碼優化和目標代碼生成六個階段,在對程序進行編譯之前,首先要做的就是詞法分析,將程序中可能出現的各種單詞歸類、編碼,以便於將各類語句拆分,判斷是否符合規範,下面就以一個例子來說明算法過程:
要點:對於給定的詞法分析表設計詞法分析器
給定詞法分析表:
序號 |
單詞類別 |
序號 |
單詞類別 |
1 |
整數 |
5 |
( |
2 |
標識符 |
6 |
) |
3 |
+ |
7 |
\n(回車) |
4 |
* |
8 |
ERROR |
詞法分析器如下:
/*表達式詞法分析器*/
#include<stdio.h>
void IdentifierStack(char *expression,int&index);//標識符辨識器
void IntegerStack(char *expression,int&index);//整數辨識器
void WordAnalysis(char *expression,int&index);//標識符詞法分析器主函數
int main(){
char expression[1000]; //表達式字符數組
int index=0;
printf("**************************\n");
printf("+++++表達式詞法分析器+++++\n");
printf("**************************\n");
printf("The expression is...\n\n");
scanf("%s",expression);
printf("\n++++++++++++++++++++\n");
printf("TABLEINDEX CONTEXT\n");
WordAnalysis(expression,index);
printf(" 7 '\\n'(換行符)\n");
printf("++++++++++++++++++++\n");
printf("**************************\n");
return 0;
}
voidIntegerStack(char *expression,int&index){
//整數辨識器
intascii,i=index;
ascii=expression[index+1];
while((48<=ascii)&&(ascii<=57)){
index++;
ascii=expression[index+1];
}
if(ascii==95||65<=ascii&&ascii<=90||97<=ascii&&ascii<=122){
printf(" 8 ERROR\n");
while(ascii==95||65<=ascii&&ascii<=90||97<=ascii&&ascii<=122){
index++;
ascii=expression[index+1];
}
}
else{
printf(" 1 '");
for(;i<=index;i++){
printf("%c",expression[i]);
}
printf("'\n");
}
return;
}
voidIdentifierStack(char *expression,int&index){
//標識符辨識器
intascii,i=index;
ascii=expression[index+1];
while((48<=ascii&&ascii<=57)||((65<=ascii&&ascii<=90)||(97<=ascii&&ascii<=122)||(ascii==95))){
index++;
ascii=expression[index+1];
}
printf(" 2 '");
for(;i<=index;i++){
printf("%c",expression[i]);
}
printf("'\n");
return ;
}
voidWordAnalysis(char *expression,int&index){
//標識符詞法分析器主函數
intascii;
for(int index=0;expression[index];index++){ //詞法分析開始
ascii=expression[index];
if(ascii==43)
printf(" 3 '+'\n");
else if(48<=ascii&&ascii<=57){
IntegerStack(expression,index);
continue;
}
else if((65<=ascii&&ascii<=90)||(97<=ascii&&ascii<=122)||(ascii==95)){
IdentifierStack(expression,index);
continue;
}
else if(ascii==42)
printf(" 4 '*'\n");
else if(ascii==40)
printf(" 5 '('\n");
else if(ascii==41)
printf(" 6 ')'\n");
else if(ascii==10)
printf(" 7 '\\n'\n");
else
printf(" 8 ERROR\n");
}
return;
}