用C++语言,写一个普适的词法分析器
时间: 2024-10-02 21:04:12 浏览: 10
在C++中编写一个通用的词法分析器通常涉及到构建一个基于输入流的解析器,它会将文本分解成有意义的单元,如标识符、关键字、运算符等。以下是一个简单的例子,使用递归下降语法,这并不是一个完整的词法分析器,但可以提供一个基本框架:
```cpp
#include <iostream>
#include <string>
#include <cctype>
enum Token {
ID,
NUMBER,
STRING,
PLUS,
MINUS,
MUL,
DIV,
EOF,
// 可以添加更多其他token...
};
class Lexer {
public:
std::string input;
size_t position;
Token getNextToken() {
if (position >= input.size()) {
return EOF;
}
char c = input[position];
if (std::isalpha(c) || c == '_') { // 标识符或下划线
while (position < input.size() && std::isalnum(input[position])) {
++position;
}
if (input.substr(position - 1, 2) == "__") {
return ID; // 检查是否是保留字
} else {
return ID;
}
} else if (isdigit(c)) { // 数字
while (position < input.size() && isdigit(input[position])) {
++position;
}
return NUMBER;
} else if (c == '\"') { // 开始字符串
++position;
while (position < input.size() && input[position] != '\"') {
if (input[position] == '\\') {
++position; // 跳过转义字符
}
++position;
}
if (position == input.size()) {
throw std::runtime_error("Unterminated string");
}
++position; // 结束标记
return STRING;
} else if (c == '+' || c == '-' || c == '*' || c == '/') { // 运算符
++position;
return static_cast<Token>(c);
}
return c ? TOKEN_UNKNOWN : EOF;
}
};
int main() {
Lexer lexer {"example + 10 * 5 \"hello world\""};
while (auto token = lexer.getNextToken()) {
switch (token) {
case ID:
std::cout << "Identifier\n";
break;
case NUMBER:
std::cout << "Number: " << token << "\n";
break;
case STRING:
std::cout << "String: " << lexer.input.substr(lexer.position - 2, lexer.input.size()) << "\n";
break;
default:
std::cout << "Operator: " << static_cast<char>(token) << "\n";
break;
}
}
return 0;
}
```
这个例子非常基础,实际的词法分析器可能会更复杂,处理更多的语法结构,并考虑错误处理和缓冲区溢出等问题。