一.程序基本任务及结构
其编译过程采用一趟扫描方式
以语法、语义分析程序为核心
词法分析程序和代码生成程序都作为一个过程,当语法分析需要读单词时就调用词法分析程序,而当语法、语义分析正确,需要生成相应的目标代码时,则调用代码生成程序。
表格管理程序实现变量,常量和过程标识符的信息的登录与查找。
出错处理程序,对词法和语法、语义分析遇到的错误给出在源程序中出错的位置和与错误 性质有关的编号,并进行错误恢复。
二.PL/0语言基本结构
<程序> :: = <程序首部> <分程序>.
<程序首部> :: = PROGRAM <标识符>;
<分程序> :: = [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句部分>
<常量说明部分> :: = CONST <常量定义>{ ,<常量定义> };
<常量定义> :: = <标识符 >= <无符号整数>
<变量说明部分> :: = VAR <标识符>{ ,<标识符> };
<过程说明部分> :: = <过程首部>; <分程序>;
<过程首部> :: = PROCEDURE <标识符>//变量定义
<语句部分> :: = <语句> | <复合语句>
<复合语句> :: = BEGIN <语句>{ ; <语句> }
<语句>:: = <赋值语句> | <条件语句> | <当型 循环语句> | <过程调用语句> | <读语句> | <写语句> | <复合语句>
<赋值语句> :: = <标识符>: = <表达式>
<读语句> :: = READ(<标识符>{, <标识符>})
<写语句> :: = WRITE(<表达式>{, <表达式>})
<过程调用语句> :: = CALL <标识符>
<条件语句> :: = IF <条件> THEN <语句>
<当型循环语句> :: = WHILE <条件> DO <语句>
<因子> :: = <标识符> | <常量> | (<表达式>)
<项> :: = <因子>{ <乘法运算符><因子> }
<乘法运算符> :: = *| /
<表达式> :: = [+| -]<项>{<加法运算符><项>}
<加法运算符> :: = +| -
<条件> :: = <表达式><关系运算符><表达式> | ODD <表达式>
<关系运算符> :: = # |= | > | >= | < | <=
三.词法分析过程
3.1 词法分析功能
词法分析器能够读入使用PL/0语言书写的源程序,完成的任务包括读源程序(getch),滤空格,识别保留字,识别标识符,拼数,识别单字符单词,拼双字符单词,输出单词符号串及其属性到一中间文件中,具有出错处理分析功能,可以给出词法错误提示。
3.2 程序流程图
1)主程序流程图
2)数字处理程序
3)其他字符处理程序
4)空格处理程序
3.3 数据结构以及函数定义
1)数据结构定义
typedef struct DisplayTable {
int Index; //标识符所在表的下标
int type; //标识符的类型
int line; //标识符所在表的行数
char symbol[20]; //标识符所在表的名称
}Table;
2)函数定义
int isLetter(char ch1)// 判断该字符是否为字母
int isDigit(char ch1)// 判断该字符是否为数字
string itos1(int n) //把整数n转换成string型
void error(char str[20], int nLine, int errorType)//出错处理
void getsym(char ch[], int chLen, Table table[Max], int nLine)//词法分析程序
四.语法分析过程
4.1 程序功能
语法分析的任务是识别由词法分析给出的单词符号序列在结构上是否符合给定的文法规则。PL/0编译程序的语法分析采用自顶向下的递归子程序法:对应每个非终结符语法单元,编一个独立的处理过程(或子程序)。 语法分析从读入第一个单词开始由非终结符‘程序’即开始符出发,沿语法描述图箭头方向进行分析。 当遇到非终结符时,调用相应的处理过程。从语法描述图看也就进入了一个语法单元,再沿当前所进入的语法描述图的箭头方向进行分析。当遇到描述图中的终结符时,则判断当前读入的单词是否与图中的终结符相匹配,若匹配,则执行相应的语义程序(就是翻译程序),再读下一个单词继续分析。遇到分支点时将当前的单词与分支点上的多个终结符逐个相比较,若不匹配时可能是进入下一个非终结符语法单元或是出错。如果一个PL/0语言的单词序列在整个语法分析中,都能逐个得到匹配,则语法分析正确。对于正确的语法分析作相应的语义翻译,最终得到目标程序。
4.2程序流程图
1)主程序流程图
2)分程序处理过程
3)常量说明部分
4)常量定义
5)变量说明
6)过程说明
7)过程首部
8)语句部分
9)语句判断
10)赋值语句
11)while语句
12)If语句
13)Write语句
14)Read语句
15)Call语句
16)表达式判断
17)项判断
18)因子判断
19)条件判断