用C++语言,写一个词法分析器
时间: 2024-10-02 10:04:10 浏览: 30
使用c++ qt 写的词法分析器.zip
在C++中编写一个词法分析器通常涉及到构造一个基于缓冲流、输入字符串或其他源的解析器。这里简单概述一个基础的词法分析过程,它会将输入分解成一个个基本的符号,如标识符、关键字、常量、运算符等:
```cpp
#include <iostream>
#include <string>
#include <cctype>
// 定义词法单元枚举
enum Token {
IDENTIFIER,
KEYWORD,
NUMBER,
OPERATOR,
EOF
};
class Lexer {
public:
// 构造函数,接收输入流
Lexer(const std::string& input) : input(input), pos(0) {}
// 获取下一个词法单元
Token nextToken() {
if (isAtEnd()) return EOF;
char ch = input[pos];
switch (ch) {
case 'a'...'z':
case 'A'...'Z': // 标识符字符
startIdentifier();
break;
case '0'...'9': // 数字字符
readNumber();
break;
case '+', '-', '*', '/': // 运算符
return OPERATOR;
// 添加其他关键词处理和其他特殊字符识别
default:
advance(); // 普通字符直接跳过
break;
}
return IDENTIFIER; // 如果没有遇到结束条件,返回IDENTIFIER
}
private:
bool isAtEnd() const { return pos >= input.size(); }
void advance() { pos++; } // 移动指针到下一个位置
void startIdentifier() { identifier.clear(); } // 初始化标识符
void readNumber() {
identifier += ch;
while (std::isdigit(ch = input[pos])) identifier += ch;
if (ch == '.') readDecimalPoint();
}
void readDecimalPoint() {
identifier += '.';
while (std::isdigit(ch = input[pos + 1])) identifier += ch;
}
std::string input;
size_t pos;
std::string identifier;
};
int main() {
std::string input = "int x = 5 + y;";
Lexer lexer(input);
while (!lexer.isAtEnd()) {
Token token = lexer.nextToken();
std::cout << "Token: " << static_cast<int>(token) << ", Value: " << lexer.identifier << std::endl;
}
return 0;
}
阅读全文