实验一:词法分析程序的设计

该实验旨在通过设计词法分析程序,理解其功能和构造过程。实验涉及定义语言子集,绘制状态转换图,并编写代码实现词法分析。测试涵盖不同单词类型,包括保留字、标识符、常数、运算符和界符。实验中,非法字符和分支覆盖被特别关注。

一、实验目的

  理解词法分析的功能,熟悉词法分析程序的构造。

二、实验原理与要求

 1、原理

 利用状态转换图来确定程序的流程。

 2、要求

 定义一个单词集,能用状态转换图描述。测试应满足分支覆盖。

三、实验设备

 配置有C/C++开发环境的计算机设备。

四、实验内容

 1. 定义语言子集并编码,要求有保留字、标识符、常数、运算符、界符。

 2. 画出状态转换图。

 3. 编写代码,实现分析。

五、实验步骤

 1. 定义语言子集的单词符号的种别编码及内码值

   如果一个种别只含有一个单词符号,则内码值为-1;如果一个种别含有多个单词符号(如:标识符、常数),用它自身的值作为内码值。

单词的分类及其表示

   定义一个结构体数组Result,用它存放识别出的单词符号的种别编码及内码值。如:输入k=99; 则输出为:(100, k), (13, -1), (110, 99), (18, -1), (0,)
结构体数组Result

 2. 构造状态转换图(自动机)

设计状态转换图-1

设计状态转换图-2
  说明:状态96~100表示输入非法字符。

 3. 状态转换图的实现(编码)

// -*- coding: utf-8 -*-
//  @ Date   : 2020/5/20 13:14
//  @ Author : RichardLau_Cx
//  @ file   : Richard.cpp
//  @ IDE    : Dex-C++
//  @ Source : 编译原理实验

/**
* 1. 以学习他人的经验为主,带入自己的想法为辅
* 2. 频繁debug各函数实现,是一种变相的效率提升 
* 3. 由于很多变量都是公共变量,所以函数调用时则不必传值 
*/

#include <string.h> 

#include <iostream>
#include <string>

using namespace std;

const char KW[6][10] = {
   
   "if", "else", "while", "int", "float", "char"};  // 保留字存储:以保留字为行,以保留字的每个字母为列 
char inputString[99]; 
int number=0;  // 各单词结构体数组的索引,相当于统计单词个数 
int i=0;  // 字符串匹配位置 
int k=0;  // k为单词的内码值下标

//(1)定义语言子集的单词符号的种别编码及内码值
	// 定义结构体数组Result 
	typedef struct{
   
   
		int typeNumber;  // 单词符号的种别编码 
		char code[100];  //  内码值 
//		string code;
	} Word;  // 单词类型定义 
	
	Word Result[100];
	

void words();
void keyWord();

void state0(); 
void state1();
void state2();
void state3();
void state4();
void state5();
void state6();
void state7();
void state8();
void state9();
void state10();
void state11();
void state12();
void state13();
void state14();
void state15();
void state16();
void state17();
void state18();
void state19();
void state20();
void state21();

void output();
void error();
void end();

/*
  当前进度:
  	1. 完成state0()和state1()的功能实现 
*/ 

	
void words()
{
   
   
	/*
		若传字符串,则考虑使用指针 
	*/ 
	cout << "function: words(): " << endl << "input: ";
	gets(inputString); 
//	cin >> inputString;  // 此方法拿不到字符串中的空格 
	
	while (inputString[i] != '\0')
	{
   
   
		k = 0;  // k为单词的内码值下标,即Result[number].Code[k]
		
		while (inputString[i] == ' ') i++;  // 剔除空格
		
		state0();  // 从0状态出发,直至到达一个终态,就识别出一个单词
		
		// 若识别出的是标识符,则需要进一步判断是否为保留字
		
		if (Result[number].typeNumber == 100)
		{
   
     // 如果单词为标识符,再进行判断是不是保留字 
			keyWord();
		} 
		 
		// 输出当前(最后一个)单词 
//		cout << "number: " << number << "\t typeNumber: " << Result[number].typeNumber << "\t Result[number].code: " << Result[number].code << endl;
		
		i++;  //  从输入串中读出下一个字符
		number++;  // 全局变量,统计单词个数 
	}
	
//	gets(string)
 } 



void keyWord() 
{
   
   
	int i;
	
//	cout << "function: keyWord()" << endl;
	
	for (i=0; i < 6; i++)
	{
   
     // 目前共有6个保留字 
		if (strcmp(Result[number].code, KW[i]) == 0)
		{
   
     // 将标识符与保留字进行比较 
			Result[number
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值