1、 编译原理 实验报告 实验题目: 词法分析 专 业: 计算机科学与技术 班 级: 计科 142 班 姓 名: 学 号: 二一八年 一 月 二 日 目录 一、实验目的: . 1 二、实验要求: . 1 三、词法分析程序的算法思想:. 2 四、程序代码: . 3 五、结果分析: . 7 六、总结: 8 1 一、实验目的: 根据词法分析器的基本原理,设计、编制并调试一个词法分析程序,加深对词法分析原 理的理解。 二、实验要求: 2.1 词法分析器:逐个读入源程序字符并按照构词规则切分成一系列单词。单词是语言中 具有独立意义的最小单位,包括保留字、标识符、运算符、标点符号和常量等。词法分析是 编译过程
2、中的一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由 语法分析程序调用词法分析程序来获得当前单词供语法分析使用。 要求:通过词法分析器 能够实现以下五种类型如单词等的识别。 (1)关键字“begin“,“end“,“if“,“then“,“else“,“while“,“write“,“read“等, “do“, “call“,“const“,“char“,“until“,“procedure“,“repeat“等 (2)运算符:“+“,“-“,“*“,“/“,“=“等 (3)界符:“,“,“,“,“;“,“,“,“.“,“(“,“)“,“:“等 (4)标识符 (其他单词是标
3、识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (5)常量 如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少 用一个空格作间隔。空格由空白、制表符和换行符组成。 2.2 各种单词符号对应的种别码: 单词符号 种别码 单词符号 种别码 begin 1 : 17 If 2 := 18 Then 3 = 24 dight dight* 11 = 25 + 13 ; 26 14 ( 27 * 15 ) 28 2 / 16 # 0 2.3 词法分析程序的功能: 输入:所给文法的源程序字
4、符串。 输出:二元组(syn,token 或 sum)构成的序列。 其中:syn 为单词种别码; token 为存放的单词自身字符串; sum 为整型常数。 例如:对源程序 begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后 输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if) 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号, 其基本思 想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图: 主程序示意图如图所示。其
5、中初始包括以下两个方面: 关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程 序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标 识符。关键字表为一个字符串数组,其描述如下: Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,; 3 (2)程序中需要用到的主要变量为 syn,token 和 sum 3.2 扫描子程序的算法思想: 首先设置 3 个变量:token 用来存放构成单词符号的字符串;sum 用来整型单词; syn 用来存放单词符号的种别码。扫
6、描子程序主要部分流程如图所示 四、程序代码: #include #include #include #include char prog80,token8,ch; int syn,p,m,n,sum; char *rwtab6=“begin“,“if“,“then“,“while“,“do“,“end“; scaner(); main() p=0; 4 printf(“n please input a string(end with #):/n“); do scanf(“%c“, progp+=ch; while(ch!=#); p=0; do scaner(); switch(syn) case 11:printf(“( %-10d%5d )n“,sum,syn); break; case -1:printf(“you have input a wrong stringn“); getch(); exit(0); default: printf