编译原理:词法分析与语法分析

需积分: 32 3 下载量 34 浏览量 更新于2024-08-16 收藏 6.82MB PPT 举报
"编译原理课件-讲解编译器设计与构造" 在编译原理中,我们主要关注的是如何将高级编程语言转换为目标机器可以理解的机器码。这个过程涉及到多个复杂阶段,包括词法分析、语法分析、语义分析、中间代码生成、代码优化以及目标代码生成。 1. **词法分析**:这是编译过程的第一步,它将源代码分解成一个个称为“Token”的基本单元,这些单元通常对应于语言的关键字、标识符、常量和运算符。在这个阶段,编译器会识别并处理文本中的注释和字符串。 2. **语法分析**:一旦词法分析完成,编译器会进入语法分析阶段,此阶段的任务是确定Token序列是否符合源语言的语法规则。通常使用上下文无关文法(CFG)来描述语言的结构。在这个例子中,提到的条件`if (ab) or (ab)`可能是用于决定何时进行移进或归约操作的规则,这与LR或LL类型的解析算法相关。 3. **语义分析**:在语法分析之后,编译器需要理解代码的含义,即其语义。这可能涉及类型检查、作用域解析和表达式求值。在处理句子`id+id*id$`时,编译器会进行算术运算的语义分析,确保操作符优先级和结合性得到正确处理。 4. **中间代码生成**:为了简化后续的优化和目标代码生成,编译器通常会生成一种抽象的中间表示(IR)。这种表示与特定机器无关,便于进行通用的代码优化。 5. **代码优化**:在生成目标代码之前,编译器会尝试改进中间代码,使其运行更高效。这可能包括删除冗余计算、死代码消除、循环展开等优化技术。 6. **目标代码生成**:最后,编译器将中间代码转换为目标机器的指令集,生成可执行的目标程序。这个阶段可能需要考虑目标架构的特性,如寻址模式和指令集架构。 教学设计上,采用了自顶向下的方法,通过问题驱动,将课程设计成一个应用平台,鼓励学生通过实践来学习。课程内容涵盖了编译器的基本结构、高级语言的语法描述、词法分析器的实现、各种语法分析技术、语法制导翻译、存储分配、代码优化和目标代码生成等核心主题。此外,教学过程中强调精讲多练,承前启后,旨在帮助学生全面掌握编译器的设计与构造。
2023-06-10 上传
2023-05-30 上传

#include<stdio.h> #include<string.h> #include<stdlib.h> /* E->E+T E->T T->T*F T->F F->(E) F->i */ void printStat(); void printFirstLine(); char vt[6] = { 'i','+','*','(',')','#'}; //存放终结符 char vn[3] = { 'E','T','F'}; //存放非终结符 const int VtLen = 6, VnLen = 3; // i + * ( ) # // ACTION表 char *action[12][6]={ {"S5", NULL, NULL, "S4", NULL, NULL }, { NULL, "S6", NULL, NULL, NULL, "acc"}, { NULL, "r2", "S7", NULL, "r2", "r2" }, { NULL, "r4", "r4", NULL, "r4", "r4" }, {"S5", NULL, NULL, "S4", NULL, NULL }, { NULL, "r6", "r6", NULL, "r6", "r6" }, {"S5", NULL, NULL, "S4", NULL, NULL }, {"S5", NULL, NULL, "S4", NULL, NULL }, { NULL, "S6", NULL, NULL, "S11", NULL }, // SB 即 S11 { NULL, "r1", "S7", NULL, "r1", "r1" }, { NULL, "r3", "r3", NULL, "r3", "r3" }, { NULL, "r5", "r5", NULL, "r5", "r5" } }; int goto1[12][3]={ 1,2,3, 0,0,0, 0,0,0, 0,0,0, //GOTO表 8,2,3, 0,0,0, 0,9,3, 0,0,10, 0,0,0, 0,0,0, 0,0,0, 0,0,0 }; char *LR[7]= {"S->E", "E->E+T", "E->T", "T->T*F", "T->F", "F->(E)", "F->i" }; //存放产生式 int a[30],topA; // 状态栈 a[] char b[30]; // 符号栈 b[] char c[30],ch; // 输入串 c int topB,len, cur_pos; void main(){ int p,sn,k; char ch,act[10],prod[10]; for(k=1;k<7;k++) printf("%s ",LR[k]); printf("\n输入符号串 -- 以#结尾,字符:i,+,*,(,) \n"); //.... printFirstLine(); topA=0; topB=0; cur_pos=0; a[topA]=0; sn=a[topA]; b[topB]='#'; p = 0; do{ ch = c[cur_pos]; printStat(); //.... sn = p; // sn,p指向状态栈栈顶 if(action[sn][k]==NULL){ printf("Error2!\n"); return; } else if(action[sn][k][0]=='a') { // 接受 acc printf("Accept!\n"); return; } else strcpy(act,action[sn][k]); if(act[0]=='S'){ //处理移进 //.... } if(act[0]=='r'){ //处理归约 //.... } }while( true ); } void printFirstLine(){ } void printStat(){ }

2023-05-31 上传