用c++写一个词法分析器
时间: 2024-02-18 19:37:53 浏览: 70
好的,下面是一个简单的词法分析器的示例代码:
```c++
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
using namespace std;
enum TokenType {
TOK_INT,
TOK_FLOAT,
TOK_OP_ADD,
TOK_OP_SUB,
TOK_OP_MUL,
TOK_OP_DIV,
TOK_LPAREN,
TOK_RPAREN,
TOK_UNKNOWN
};
struct Token {
TokenType type;
string value;
Token(TokenType t, const string& v) : type(t), value(v) {}
};
vector<Token> lex(const string& input) {
vector<Token> tokens;
size_t pos = 0;
while (pos < input.size()) {
if (isdigit(input[pos])) {
// integer or float
string number;
while (pos < input.size() && (isdigit(input[pos]) || input[pos] == '.')) {
number.push_back(input[pos++]);
}
if (number.find('.') == string::npos) {
tokens.emplace_back(TOK_INT, number);
} else {
tokens.emplace_back(TOK_FLOAT, number);
}
} else if (input[pos] == '+') {
tokens.emplace_back(TOK_OP_ADD, "+");
pos++;
} else if (input[pos] == '-') {
tokens.emplace_back(TOK_OP_SUB, "-");
pos++;
} else if (input[pos] == '*') {
tokens.emplace_back(TOK_OP_MUL, "*");
pos++;
} else if (input[pos] == '/') {
tokens.emplace_back(TOK_OP_DIV, "/");
pos++;
} else if (input[pos] == '(') {
tokens.emplace_back(TOK_LPAREN, "(");
pos++;
} else if (input[pos] == ')') {
tokens.emplace_back(TOK_RPAREN, ")");
pos++;
} else if (isspace(input[pos])) {
pos++;
} else {
tokens.emplace_back(TOK_UNKNOWN, string(1, input[pos]));
pos++;
}
}
return tokens;
}
int main() {
string input = "3.14 + 2 * (5 - 1)";
auto tokens = lex(input);
for (const auto& token : tokens) {
cout << token.value << " ";
}
cout << endl;
return 0;
}
```
该代码定义了一个 `TokenType` 枚举,用于表示不同类型的令牌。`Token` 结构体包含一个令牌类型和其值。`lex` 函数接受一个输入字符串,并返回一个 `Token` 的向量。
在 `lex` 函数中,我们使用一个循环来遍历输入字符串中的每个字符,根据不同的字符类型来生成对应的令牌。如果遇到数字,则生成一个整数或浮点数令牌,如果遇到运算符,则生成相应的运算符令牌,如果遇到括号,则生成相应的括号令牌,如果遇到空格,则忽略该字符,如果遇到其他字符,则生成一个未知令牌。
在 `main` 函数中,我们定义一个输入字符串,并调用 `lex` 函数来生成令牌。然后,我们遍历生成的令牌,并输出每个令牌的值。
阅读全文