词法分析程序的设计(编译原理实验一)

本次实验旨在设计一个词法分析程序,能识别三种整数、标识符、主要运算符和关键字。程序要求能以二元组形式输出单词种类及其属性,并提供了具体的测试数据。实验内容包括使用fopen_s()、feof()和fogets()等函数进行文件操作和字符串读取。
摘要由CSDN通过智能技术生成

词法分析程序的设计(编译原理实验一)

一、实验内容

​ 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。

二、实验要求

  1. 编写程序,识别如下单词符号

    标识符 <字母>(<字母>|<数字字符>)*

    十进制整数 0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)

    八进制整数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*

    十六进制整数 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*

    运算符和界符 + - * / > < = ( ) ;

    关键字 if then else while do

  2. 以二元组形式输出单词<单词种类,单词属性>

    其中单词种类用整数表示:

    0:标识符

    1:十进制整数

    2:八进制整数

    3:十六进制整数

    运算符和界符,关键字采用一字一符,不编码

    其中单词属性表示如下:

    标识符,整数由于采用一类一符,属性用单词表示

    运算符和界符,关键字采用一字一符,属性为空

三、测试数据

输入数据:

​ 编辑一个文本文件program.txt,在文件中输入如下内容:

在这里插入图片描述

正确结果:

在这里插入图片描述

四、实验代码

//头文件
#include <iostream>
#include <algorithm>
#include <string>

using namespace std;

//全局变量
string instr;//输入符号串  存放整个程序的字符串
int index;//当前输入符号读入字符的位置,字符指针,逐个读取instr,识别出一个一个单词
char character;//全局变量字符,存放index读取的字符
string token;//字符数组,存放已读入的字符序列,也即目前读取的单词


const int len = 10;
string Reserve[len];//保留字表


//要输出的二元组形式:<单词种类,单词属性>
struct Binary {
   
	Binary(string t, string v) {
   
		type = t;
		value = v;
	}
	string type;
	string value;
};

//构造关键字表的函数
void init_Reserve() {
   
	Reserve[0] = "if";
	Reserve[1] = "then";
	Reserve[2] = "else";
	Reserve[3] = "while";
	Reserve[4] = "do";
}

//读入一个字符
void getChar() {
   
	character = instr[index++];
}

//读入非空白字符
void getnbc() {
   
	while (character == ' ') {
   
		getChar();
	}
}

//连接字符串
void concat() {
   
	token = token + character;
}


//判断是否为字母
bool letter() {
   
	if ((character >= 'A' && character <= 'Z') || (character >= 'a' && character <= 'z'))
		return true;
	return false;
}


//判断是否为数字
bool digit() {
   
	if (character >= '0' && character <= '9')
		return true;
	return false;
}


//回退读取字符串的指针
void retract() {
   
	character = ' ';
	index--;
}	  


//判断标识符
bool isIdentifier() {
   	
	for (int i = 1; i < token.size(); i++) {
   
		if (!((token[i] >= '0' && token[i] <= '9') || 
  • 14
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值