1、课程设计课程设计 1 1- -C C 语言语言词法分析器词法分析器 1.1.题目题目 C C 语言语言词法分析词法分析 2.2.内容内容 选一个能正常运行的 c 语言程序,以该程序出现的字符作为单词符号集,不用 处理 c 语言的所有单词符号。 将解析到的单词符号对应的二元组输出到文件中保存 可以将扫描缓冲区与输入缓冲区合成一个缓冲区, 一次性输入源程序后就可以进 行预处理了 3.3.设计目的设计目的 掌握词法分析算法,设计、编制并调试一个词法分析程序,加深对词法分析原 理的理解 4.4.设计设计环境(电脑语言环境)环境(电脑语言环境) 语言环境:C 语言 CPU:i7HQ6700 内存:8G
2、5.5.概要设计(单词符号表,状态转换图)概要设计(单词符号表,状态转换图) 5.1 词法分析器的结构 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token 或 sum)构成的序列。 词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序, 当需要一个单词时,就调用此法分析子程序返回一个单词. 为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的 全局变量及子程序: 1) ch 存放最新读进的源程序字符 2) strToken 存放构成单词符号的字符串 3) Buffer 字符缓冲区 4)struct keyType 存放保留字的
3、符号和种别 5.2 待分析的简单词法 (1)保留字 break、case、char、const、int、do、while (2)运算符和界符 = 、+、 -、 * 、/、%、 , 、 ; 、 (、 ) 、?、# 5.3 各种单词符号对应的种别码 单词符号 种别码 单词符号 种别码 ID 0 sizeof 24 源程序 输入缓冲区 预处理子程序 扫描缓冲区 1 扫描缓冲区 2 词法分析子程序 返回一个单词 调用 数据 INT 1 static 25 auto 2 struct 26 break 3 switch 27 case 4 typedef 28 char 5 union 29 const
4、 6 unsigned 30 continue 7 void 31 default 8 volatile 32 do 9 while 33 double 10 = 34 else 11 + 35 enum 12 - 36 extern 13 * 37 float 14 / 38 for 15 % 39 goto 16 , 40 if 17 ; 41 int 18 ( 42 long 19 ) 43 register 20 ? 44 return 21 clear 45 short 22 # 46 signed 23 lettet(letter|digit) * 47 dight dight*
5、48 5.3 状态转换图 6.6.详细设计(数据结构,子程序详细设计(数据结构,子程序) 算法思想: 首先设置 3 个变量:strToken用来存放构成单词符号的字符串;ch 用来字符;struct keyType用来存放单词符号的种别码。扫描子程序主要 部分流程如下图所示。 子程序结构: 子程序名 功能 GETCHAR() 读一个字符到 ch 中 GETBC() 读一个非空白字符到 ch 中 CONCAT() 把 CHAR 中字符连接到 strToken 之后 LETTER() 判断 CHAR 中字符是否为字母 DIGIT() 判断 ch 中字符是否为数字 RESERVE() 用 strTo
6、ken 中的字符串查找保留字表,并返回 保留字种别码,若返 回零,则非保留字 RETRACT() 把 CHAR 中字符回送到缓冲区 7.7.程序清单程序清单 / ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 / #include “stdafx.h“ #include “stdio.h“ #include “stdlib.h“ #include “conio.h“ #include “string.h“ #define N 47 char ch; char strToken20;/存放构成单词符号的字符串 char buffer1024; /字符缓冲区 struct keyType char keyname256; int value; KeyN = “$ID“,0 , “$INT“,1 , “auto“,2 , “break“,3 , “case“,4 , “char“,5 , “const“,6 , “continue“,7 ,