https://github.com/leozhang1/QtInterpreter这个链接的代码 展示一下
时间: 2023-10-07 21:08:13 浏览: 47
这是一个基于 Qt 的简单解释器,支持解释运行加、减、乘、除四则运算和赋值运算。
以下是关键代码的简要说明:
1. 定义 Token 类,表示解释器中的单词。
```cpp
class Token {
public:
enum Type { INVALID, INTEGER, PLUS, MINUS, MUL, DIV, ASSIGN, VARIABLE };
Token(Type type = INVALID, QString text = QString(), int value = 0) : m_type(type), m_text(text), m_value(value) {}
Type type() const { return m_type; }
QString text() const { return m_text; }
int value() const { return m_value; }
private:
Type m_type;
QString m_text;
int m_value;
};
```
2. 定义 Lexer 类,负责将输入的字符串分解成 Token 序列。
```cpp
class Lexer {
public:
Lexer(QString text) : m_text(text), m_pos(0) {}
Token getNextToken();
private:
QString m_text;
int m_pos;
QChar getCurrentChar();
void advance();
void skipWhitespace();
Token parseNumber();
Token parseOperator();
Token parseVariable();
};
```
3. 定义 Interpreter 类,负责解释执行 Token 序列表示的程序。
```cpp
class Interpreter {
public:
Interpreter() : m_variables(QHash<QString, int>()) {}
int interpret(QString text);
private:
QHash<QString, int> m_variables;
int visit(ASTNode* node);
int visitBinOpNode(BinOpNode* node);
int visitNumNode(NumNode* node);
int visitUnaryOpNode(UnaryOpNode* node);
int visitAssignNode(AssignNode* node);
int visitVarNode(VarNode* node);
};
```
4. 定义 ASTNode 类,表示抽象语法树中的节点。
```cpp
class ASTNode {
public:
virtual ~ASTNode() {}
virtual int accept(Interpreter* interpreter) = 0;
};
```
5. 定义具体的 ASTNode 子类,包括 NumNode、BinOpNode、UnaryOpNode、AssignNode 和 VarNode。
```cpp
class NumNode : public ASTNode {
public:
NumNode(int value) : m_value(value) {}
int value() const { return m_value; }
virtual int accept(Interpreter* interpreter) { return interpreter->visitNumNode(this); }
private:
int m_value;
};
class BinOpNode : public ASTNode {
public:
BinOpNode(Token op, ASTNode* left, ASTNode* right) : m_op(op), m_left(left), m_right(right) {}
Token op() const { return m_op; }
ASTNode* left() const { return m_left; }
ASTNode* right() const { return m_right; }
virtual int accept(Interpreter* interpreter) { return interpreter->visitBinOpNode(this); }
private:
Token m_op;
ASTNode* m_left;
ASTNode* m_right;
};
class UnaryOpNode : public ASTNode {
public:
UnaryOpNode(Token op, ASTNode* expr) : m_op(op), m_expr(expr) {}
Token op() const { return m_op; }
ASTNode* expr() const { return m_expr; }
virtual int accept(Interpreter* interpreter) { return interpreter->visitUnaryOpNode(this); }
private:
Token m_op;
ASTNode* m_expr;
};
class AssignNode : public ASTNode {
public:
AssignNode(VarNode* var, ASTNode* expr) : m_var(var), m_expr(expr) {}
VarNode* var() const { return m_var; }
ASTNode* expr() const { return m_expr; }
virtual int accept(Interpreter* interpreter) { return interpreter->visitAssignNode(this); }
private:
VarNode* m_var;
ASTNode* m_expr;
};
class VarNode : public ASTNode {
public:
VarNode(Token token) : m_token(token) {}
Token token() const { return m_token; }
virtual int accept(Interpreter* interpreter) { return interpreter->visitVarNode(this); }
private:
Token m_token;
};
```
这些类的实现可以在该代码库中的相应文件中找到。