文章目录
一、实验目的
理解词法分析的功能,熟悉词法分析程序的构造。
二、实验原理与要求
1、原理
利用状态转换图来确定程序的流程。
2、要求
定义一个单词集,能用状态转换图描述。测试应满足分支覆盖。
三、实验设备
配置有C/C++开发环境的计算机设备。
四、实验内容
1. 定义语言子集并编码,要求有保留字、标识符、常数、运算符、界符。
2. 画出状态转换图。
3. 编写代码,实现分析。
五、实验步骤
1. 定义语言子集的单词符号的种别编码及内码值
如果一个种别只含有一个单词符号,则内码值为-1;如果一个种别含有多个单词符号(如:标识符、常数),用它自身的值作为内码值。

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

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

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

4872

被折叠的 条评论
为什么被折叠?



