程序编译过程由词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段,在对程序进行编译之前,首先要做的就是词法分析,将程序中可能出现的各种单词归类、编码,以便于将各类语句拆分,判断是否符合规范,下面就以一个例子来说明算法过程:
要点:对于给定的词法分析表设计词法分析器
给定词法分析表:
序号 | 单词类别 | 序号 | 单词类别 |
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;
}