一、实验内容
给定下表所示的一个简单语言的词法规则描述完成以下任务:
(1)画出识别该语言词法规则的状态转换图;
(2)依据状态转换图,设计并编制词法分析程序,实现从输入源程序中,识别出各类单词,即关键字、标识符、常数、运算符、界符五大类,并输出各个单词的种别码和单词符号自身的值。
(3)设计恰当的测试用例对各类单词的识别进行测试。
二、实验原理
1.状态转换图
2.词法分析程序的功能
输入: 文法的源程序字符串
输出: 二元组(code,input)构成的序列
code:单词的种别码
input:单词符号
3.程序设计思路
(1)首先我们要了解五类单词字符—关键字、标识符、常数、运算符、界符。其中标识符是以字母开头、以字母和数字组成的任意符号串,常数为整数,即以数字组成的符号串。同时,我们也已经知道了单词符号的种别码。
(2)为了判别单词字符的类型,我们可以将整个程序分成五个部分:主函数,核心子程序,判断关键字函数,判断字母函数,判断数字函数。
(3)设一个input数组,接收控制台输入字符流,并送给语法分析程序。同时,设置一个存放关键字key的数组。
c.如果是运算符或者界符,先读取该运算符或者界符,然后再多读一位以确保找到正确的单词符号。
(4)每读取完一种符号就将该符号的种别码返回给主函数,并按照二元组形式输出。输出完毕后还可继续输入字符串,直到输入#结束程序。
4.数据结构
输入字符串后主函数调用judge(),其中code为种别码,i的值不能超过输入字符串的最大长度,s为输入的字符串;judge()调用isDigit(),isLetter(),isKey()三个判断函数;key数组提前存储好了关键字以便于比较;input数组在judge()中为输入缓冲区,最后作为参数一起返回到主函数中输出,每调用一次judge()其缓冲区就清零以便存储新的单词符号。文章来源:https://www.toymoban.com/news/detail-558164.html
int isDigit(); //判断是否为数字的函数
int isLetter(); //判断是否为字母的函数
int isKey(); //判断是否为关键字
void judge(int& code, int& i, char s[]); //核心子程序
char key[8][10] = {
"void", "main", "int", "char", "if", "else","for","while" }; //存储关键字
char input[100]; //输入缓冲区
三、结果分析
1.测试用例
输入if(a>=0) sum+=1 ,第一行输出(种别码,单词符号),第二行输出关键字“if”的种别码105和自己本身的符号,第三行输出界符“(”的种别码301和自己本身的符号,往下依次完成了该输入字符串的识别。
再输入else b=3,还可继续识别。直到输入“#”结束程序。
文章来源地址https://www.toymoban.com/news/detail-558164.html
四、源代码
/*-----------词法分析核心程序 -----------*/
void judge(int& code, unsigned int& i, char s[])
{
int temp = 0; //清空缓冲区以便存储新的单词字符
if (s[i] ==
到了这里,关于【编译原理】词法分析程序设计(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!