能否提供一份关于词法分析器实验的具体源代码示例
时间: 2024-10-13 11:19:11 浏览: 36
当然可以,这里是一个简单的C++词法分析器源代码示例,使用了递归下降解析器的方法。请注意,这只是一个基础的演示,实际项目可能会更复杂,包含更多的错误处理和优化:
```cpp
#include <iostream>
#include <string>
#include <unordered_map>
// 定义token类型
enum class TokenType {
ID, // 标识符
NUMBER, // 数字
STRING, // 字符串
KEYWORD, // 关键字
EOF, // 结束符
};
class Tokenizer {
private:
std::string input;
size_t position = 0;
public:
void setInput(const std::string& str) { input = str; }
Token getNextToken() {
while (position < input.length()) {
char c = input[position];
if (isalnum(c)) {
return getToken(TokenType::ID);
} else if (isdigit(c)) {
return getToken(TokenType::NUMBER);
} else if (c == '\"') {
return getStringToken();
} else if (c == ';', '{', '}', ',', '+', '-', '*', '/', '%', '<', '>', '=') {
return getToken(static_cast<TokenType>(c));
}
++position;
}
return Token(TokenType::EOF, "End of File");
}
private:
Token getToken(TokenType type) {
return Token(type, std::to_string(position), input.substr(position, 1));
}
Token getStringToken() {
size_t start = position + 1;
while (position < input.length() && input[position] != '\"') {
++position;
}
if (position >= input.length()) {
throw std::runtime_error("Unterminated string");
}
++position;
return Token(TokenType::STRING, std::to_string(start), input.substr(start, position - start - 1));
}
};
struct Token {
TokenType type;
std::string value;
std::string literal; // 仅对某些类型有用
Token(TokenType t, const std::string& v, const std::string& lit) : type(t), value(v), literal(lit) {}
};
int main() {
Tokenizer tokenizer{"10 + 20; Hello World"};
Token token = tokenizer.getNextToken();
while (token.type != TokenType::EOF) {
std::cout << "Token Type: " << static_cast<int>(token.type) << ", Value: " << token.value << std::endl;
token = tokenizer.getNextToken();
}
return 0;
}
```
这个例子简单地读取输入流,识别数字、标识符、字符串和一些基本的关键词,并返回相应的`Token`对象。在实际的词法分析器中,你需要根据具体的语言规范添加更多的规则和错误处理。
阅读全文