-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArithExpr.hpp
133 lines (105 loc) · 2.96 KB
/
ArithExpr.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//
// Created by smith on 3/20/2019.
//
#ifndef EXPRINTER_ARITHEXPR_HPP
#define EXPRINTER_ARITHEXPR_HPP
#include "Token.hpp"
#include "SymTab.hpp"
#include "TypeDescriptor.hpp"
// Classes in this file define the internal representation of arithmetic expressions.
// An ExprNode serves as the base class (super class) for arithmetic expression.
// It forces the derived classes (subclasses) to implement two functions, print and
// evaluate.
class ExprNode {
public:
ExprNode(Token token);
Token token();
virtual void print() = 0;
virtual TypeDescriptor evaluate(SymTab &symTab) = 0;
private:
Token _token;
};
// An InfixExprNode is useful to represent binary arithmetic operators.
class InfixExprNode: public ExprNode { // An expression tree node.
public:
InfixExprNode(Token tk);
ExprNode *&left();
ExprNode *&right();
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
private:
ExprNode *_left, *_right;
};
// WholeNumber is a leaf-node in an expression tree. It corresponds to
// a terminal in the production rules of the grammar that describes the
// syntax of arithmetic expressions.
class WholeNumber: public ExprNode {
public:
WholeNumber(Token token);
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
};
class DecimalNumber: public ExprNode {
public:
DecimalNumber(Token token);
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
};
// Variable is a leaf-node in an expression tree. It corresponds to
// a terminal in the production rules of the grammar that describes the
// syntax of arithmetic expressions.
class Variable: public ExprNode {
public:
Variable(Token token);
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
};
class Keyword: public ExprNode {
public:
Keyword(Token token);
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
};
class String: public ExprNode {
public:
String(Token token);
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
};
//prefix
class PrefixExprNode: public ExprNode { // An expression tree node.
public:
PrefixExprNode(Token tk);
ExprNode *&right();
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
private:
ExprNode *_right;
};
//Function
class FunctionExpr: public ExprNode {
public:
FunctionExpr(Token tk, ExprNode *params);
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
private:
ExprNode *_params;
};
//Subscript
class Subscript: public ExprNode {
public:
Subscript(Token tk, ExprNode *rhsExpr);
ExprNode *&right();
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
private:
ExprNode *_right;
};
//ArrayLen
class Array_len: public ExprNode {
public:
Array_len(Token token);
virtual void print();
virtual TypeDescriptor evaluate(SymTab &symTab);
};
#endif //EXPRINTER_ARITHEXPR_HPP