- 14
- 0
- 约7.81千字
- 约 8页
- 2018-01-02 发布于河南
- 举报
编译原理_词法分析器实验报告
实验题目和要求。
题目:设计PL / 0语言的词法分析器。
要求:
单词(关键字);
begin end if then else while write read do
call const var procedure repeat until
运算符:+ - * / := = (#) = =
界符: , . ; ( )
标识符:字母打头的字母数字串,长度不超过10.
常数:整数,所含数字的个数不超过14.
返回单词形式: 二元式(种别,属性值)
实验平台。
PC机: Windows XP操作系统
编程环境: Turbo C 2.0
编程语言: C语言
实验算法说明。
定义2个全局变量char ch和char strtoken分别用来存放最新读入的源
程序字符和构成单词符号的字符串。然后用各个子函数的功能和读文件内容的操作,实现对源程序的词法分析,分别进行关键字,标识符,常数,运算符和界符的分析确认,然后将对应的二元式结果输出。
首先用户输入要读文件的名称,然后程序会把文件的内容读到定义的够大的字符数组str(相当于词法分析的一个缓冲区)里,然后开始从str里一个一个的读出字符并放在专门用来暂时存放单词数组strtoken里进行词法分析,若符合语言的规则,则打印出相关的说明信息,即该字符或字符串的二元式信息,可以清楚的明白该字符的种别和属性值。如果读入的字符或字符串是非法的,即不是语法规定或是没有意义的字符或字符串,程序会提示相关的错误信息并进行一定的说明。
程序子函数功能说明。
1. void getChar( ) 将下一个输入字符读到ch中,搜索指示器前移一个字符的位置。
2. void getBc( ) 检查ch中的字符是否为空白,若是,则调用getChar( ),直到ch中进入一个非空的字符。
3. void retract( ) 将搜索指示器回调一个字符位置,将ch置为空白字符。
4. void concat( ) 将ch中的字符连接到strtoken之后。
5.int Isletter( ) 子函数过程,判断ch中的字符是否为字母。
6.int Isdigit( ) 子函数过程,判断ch中的字符是否为数字。
7. int Iskey_ch( ) 子函数过程,判断strtoken中的字符串是否为程序设计语言的关键字,若是,打印并返回它的二元式。
8. void Isident( ) 子函数过程,判断strtoken中的字符串是否为程序设计语言规定的标识符。
9. void empty( ) 将strtoken字符数组置空,然后接收下一个字符并分析。
10. void Isnum( ) 子函数过程,判断strtoken中的字符串是否为数字串常量, 若是,打印并返回它的二元式。
11. void error( ) 子函数过程,判断ch中的字符是否为非法字符,若是,则打印该非法字符并提示。
12. int Isjiefu( ) 子函数过程,判断strtoken中的字符串是否为程序设计语言语法规定的界符。
13. int Issuanfu( ) 子函数过程,判断strtoken中的字符串是否为程序设计语言语法规定的运算符号。
14. void readfile( ) 子函数过程,用户输入要分析的文件名,然后读文件操作,把文件内容读入到字符数组。
程序源代码(C语言):
#include stdio.h
#include conio.h
#include stdlib.h
typedef char CH1[15];
typedef char CH2[2];
typedef char NUM[25];
CH1 key_ch[15]={begin,end,if,then,else,while,write,read,
do,call,const,var,procedure,repeat,until};
CH1 Id[15]={}; //定义数组,存放读出的标识符
NUM num[20]; //定义数组,存放读出的常数
CH2 key1[12]={+,-,*,/,:=,=,,=,,=,,#};
CH1 key1name[12]={Add,Subtract,Multiple,Devide,Evaluate,
Equal,Smaller,Small_equal,Bigger,Bigger_equal,
Not_equal,Not_equal};
char key2[5]={,,.,;,(,)};
CH1 key2name[5]={Comma,Period,Semicolon,Lparenthesis,
Rparenthesis};
char ch
原创力文档

文档评论(0)