用c++写一个词法分析程序
时间: 2023-09-12 20:03:51 浏览: 86
好的,下面是一个简单的C++词法分析程序示例:
```cpp
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
// 定义Token的类型枚举
enum class TokenType {
Invalid, // 无效Token
Number, // 数字
Plus, // 加号
Minus, // 减号
Multiply, // 乘号
Divide, // 除号
LeftParenthesis, // 左括号
RightParenthesis // 右括号
};
// 定义Token结构体
struct Token {
TokenType type;
string value;
Token(TokenType type = TokenType::Invalid, const string& value = ""):
type(type), value(value) {}
};
// 定义Token解析函数
Token getToken(const string& input, size_t& currentPos) {
if (currentPos >= input.size()) {
return Token(TokenType::Invalid, "");
}
// 跳过空白字符
while (isspace(input[currentPos])) {
++currentPos;
}
// 解析数字
if (isdigit(input[currentPos])) {
string value;
while (isdigit(input[currentPos])) {
value += input[currentPos];
++currentPos;
}
return Token(TokenType::Number, value);
}
// 解析操作符
switch (input[currentPos]) {
case '+': {
++currentPos;
return Token(TokenType::Plus, "+");
}
case '-': {
++currentPos;
return Token(TokenType::Minus, "-");
}
case '*': {
++currentPos;
return Token(TokenType::Multiply, "*");
}
case '/': {
++currentPos;
return Token(TokenType::Divide, "/");
}
case '(': {
++currentPos;
return Token(TokenType::LeftParenthesis, "(");
}
case ')': {
++currentPos;
return Token(TokenType::RightParenthesis, ")");
}
default:
return Token(TokenType::Invalid, "");
}
}
// 主函数
int main() {
string input;
cout << "请输入表达式:" << endl;
getline(cin, input);
size_t currentPos = 0;
while (true) {
Token token = getToken(input, currentPos);
if (token.type == TokenType::Invalid) {
break;
}
cout << "Token: " << token.value << " Type: " << static_cast<int>(token.type) << endl;
}
return 0;
}
```
这个程序可以解析简单的数学表达式,包括数字、加减乘除以及括号。它的基本原理是从输入字符串中读取字符,并根据字符的类型解析出对应的Token。在解析数字时,程序会连续读取数字字符直到遇到非数字字符;而在解析操作符时,程序只需要判断当前字符是哪种操作符即可。最后,程序会输出解析结果,包括Token的值和类型。
阅读全文