资源库-编译原理 实验一:c++ vertor实现简单词法分析器

#include <iostream>
using namespace std;
#include <string>

struct Token {
	std::string type; // 词法单元类型,如"IDENTIFIER", "SEPARATOR"
	std::string value; // 词法单元的值
};
#include <vector>
#include <cctype>

pair<bool, string> keywordIdentify(string identifier) {
	if (identifier == "int")
		return pair<bool, string>(1, "关键字int");
	else if (identifier == "main")
		return pair<bool, string>(1, "主程序入口main");
	else if (identifier == "return")
		return pair<bool, string>(1, "关键字return");
	else {
		return pair<bool, string>(0, "");
	}
}

vector<Token> tokenize(const std::string &input) {
	vector<Token> tokens;
	size_t pos = 0;

	while (pos < input.size()) {
		if (isspace(input[pos])) { // 跳过空白字符
			++pos;
		} else if (isalpha(input[pos]) || input[pos] == '_') { // 标识符
			string identifier;
			while (pos < input.size() && (isalnum(input[pos]) || input[pos] == '_')) {
				identifier += input[pos++];
			}
			pair<bool, string> res = keywordIdentify(identifier);
			if (res.first) {
				tokens.push_back({res.second, identifier});
			} else
				tokens.push_back({"标识符", identifier});
		} else { // 其他字符视为分隔符处理
			tokens.push_back({"分隔符", string(1, input[pos++])});
		}
	}

	return tokens;
}



int main() {
	string input = "int main() { int __a = 5; return 0; }";
	auto tokens = tokenize(input);

	for (const auto &token : tokens) {
		std::cout << "Type: " << token.type << ", Value: '" << token.value << "'\n";
	}

	return 0;
}

这一个词法分析器简单地读取标准输入,然后用了两个动态数组分别存放分隔符和标识符。

还用了一个辅助函数,用于在标识符里识别关键字。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值