# 源程序格式处理 **Repository Path**: gyjchonga/source-program-format ## Basic Information - **Project Name**: 源程序格式处理 - **Description**: 根据巴克斯(BNF)范式定义的语法规则,通过词法和语法分析生成源程序的抽象语法树(AST),并依据此语法树将源程序按照优美的排版输出在一个新的文档里 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-03 - **Last Updated**: 2021-09-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 源程序格式处理 #### 介绍 根据巴克斯(BNF)范式定义的语法规则,通过词法和语法分析生成源程序的抽象语法树(AST),并依据此语法树将源程序按照优美的排版输出在一个新的文档里 词法分析:共需要识别五种单词,标识符、关键字、常量、运算符和定界符,算法每识别到一种单词,就返回单词的编码,为了唯一确定单词的编码,C语言中我们可以使用枚举类型来定义各类单词的编号,并通过有限状态机来完成对每个单词的识别,从而完成编码的返回。 利用递归下降分析法,通过大量的递归算法,将巴克斯范式定义的语法规则通过抽象语法树的形式体现出来,每个非叶子结点都保存当前语句属于何种语句(外部定义、局部定义、编译预处理等),叶子节点则保存上述词法分析中的单词编码,从而便于后续遍历生成排版优美的语句。 针对计算式的处理,由于需要考虑通过中序遍历的方式获得语句,就必须让程序拥有判断运算符优先级的能力,由于我们已经通过词法分析获得了每个运算符的编码,因此现在需要建立一个编码优先级表,也就是建立一个二维数组,用来保存各个运算符编码之间的运算优先级。有了这张表之后,在通过运算符栈以及操作数栈两个堆栈相互配合,生成计算式的中序遍历二叉树。