编译原理用c++写一个分词器能够读入并且输出文档
时间: 2024-11-06 17:22:03 浏览: 16
编译原理中的分词器通常是一个程序,用于将文本分解成有意义的词语单位,比如单词、短语或标记。以下是使用C++编写一个简单的文本分词器的基本步骤:
1. **包含必要的库**:
```cpp
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
```
2. **定义分词函数**:
```cpp
std::vector<std::string> tokenize(const std::string& input) {
std::vector<std::string> tokens;
size_t start = 0;
for (size_t i = 0; i < input.size(); ++i) {
if (isalpha(input[i]) || input[i] == ' ') { // 检查字符是否字母或空格
if (i != start) { // 如果不是开始位置且遇到非字母或空格
tokens.push_back(input.substr(start, i - start)); // 添加前一个词到结果
}
start = i + 1; // 更新起始位置到下一个字符
}
}
if (start < input.size()) { // 处理最后一个词
tokens.push_back(input.substr(start));
}
return tokens;
}
```
3. **主程序部分**:
```cpp
int main() {
std::ifstream file("input.txt"); // 打开输入文件
if (!file.is_open()) {
std::cerr << "Error opening file." << std::endl;
return 1;
}
std::string line;
while (std::getline(file, line)) {
std::vector<std::string> words = tokenize(line); // 分词
for (const auto& word : words) {
std::cout << word << " ";
}
std::cout << "\n"; // 输出每个词后换行
}
file.close();
return 0;
}
```
在这个例子中,我们假设输入文件(如`input.txt`)是一段文本,通过逐行读取并调用`tokenize`函数,然后打印出分割后的词语。
**相关问题--:**
1. 这个简单分词器如何处理标点符号和其他特殊字符?
2. 怎么改进这个分词器使其能识别专有名词和停用词?
3. 使用正则表达式能否提高分词效果?如果可以,你能给出一个正则版本吗?
阅读全文