Private unions (#492)

* changed union of Statement to be private

* changed the union in Expression to be private

* changed union in Value to be private

* changed AST constructors to be static methods

* updates to syntax unit tests
This commit is contained in:
Jeremy G. Siek
2021-04-27 14:29:13 -04:00
committed by GitHub
parent 1933cfeeeb
commit 8924f5620b
11 changed files with 1105 additions and 780 deletions
+89 -71
View File
@@ -49,86 +49,104 @@ enum class Operator {
Sub,
};
struct Expression;
struct Variable {
std::string* name;
};
struct FieldAccess {
const Expression* aggregate;
std::string* field;
};
struct Index {
const Expression* aggregate;
const Expression* offset;
};
struct PatternVariable {
std::string* name;
const Expression* type;
};
struct Tuple {
std::vector<FieldInitializer>* fields;
};
struct PrimitiveOperator {
Operator op;
std::vector<const Expression*>* arguments;
};
struct Call {
const Expression* function;
const Expression* argument;
};
struct FunctionType {
const Expression* parameter;
const Expression* return_type;
};
struct Expression {
int line_num;
ExpressionKind tag;
static auto MakeVar(int line_num, std::string var) -> const Expression*;
static auto MakeVarPat(int line_num, std::string var, const Expression* type)
-> const Expression*;
static auto MakeInt(int line_num, int i) -> const Expression*;
static auto MakeBool(int line_num, bool b) -> const Expression*;
static auto MakeOp(int line_num, Operator op,
std::vector<const Expression*>* args) -> const Expression*;
static auto MakeUnOp(int line_num, enum Operator op, const Expression* arg)
-> const Expression*;
static auto MakeBinOp(int line_num, enum Operator op, const Expression* arg1,
const Expression* arg2) -> const Expression*;
static auto MakeCall(int line_num, const Expression* fun,
const Expression* arg) -> const Expression*;
static auto MakeGetField(int line_num, const Expression* exp,
std::string field) -> const Expression*;
static auto MakeTuple(int line_num, std::vector<FieldInitializer>* args)
-> const Expression*;
static auto MakeUnit(int line_num) -> const Expression*;
static auto MakeIndex(int line_num, const Expression* exp,
const Expression* i) -> const Expression*;
static auto MakeTypeType(int line_num) -> const Expression*;
static auto MakeIntType(int line_num) -> const Expression*;
static auto MakeBoolType(int line_num) -> const Expression*;
static auto MakeFunType(int line_num, const Expression* param,
const Expression* ret) -> const Expression*;
static auto MakeAutoType(int line_num) -> const Expression*;
static auto MakeContinuationType(int line_num) -> const Expression*;
Variable GetVariable() const;
FieldAccess GetFieldAccess() const;
Index GetIndex() const;
PatternVariable GetPatternVariable() const;
int GetInteger() const;
bool GetBoolean() const;
Tuple GetTuple() const;
PrimitiveOperator GetPrimitiveOperator() const;
Call GetCall() const;
FunctionType GetFunctionType() const;
private:
union {
struct {
std::string* name;
} variable;
struct {
const Expression* aggregate;
std::string* field;
} get_field;
struct {
const Expression* aggregate;
const Expression* offset;
} index;
struct {
std::string* name;
const Expression* type;
} pattern_variable;
Variable variable;
FieldAccess get_field;
Index index;
PatternVariable pattern_variable;
int integer;
bool boolean;
struct {
std::vector<FieldInitializer>* fields;
} tuple;
struct {
Operator op;
std::vector<const Expression*>* arguments;
} primitive_op;
struct {
const Expression* function;
const Expression* argument;
} call;
struct {
const Expression* parameter;
const Expression* return_type;
} function_type;
Tuple tuple;
PrimitiveOperator primitive_op;
Call call;
FunctionType function_type;
} u;
};
auto MakeVar(int line_num, std::string var) -> const Expression*;
auto MakeVarPat(int line_num, std::string var, const Expression* type)
-> const Expression*;
auto MakeInt(int line_num, int i) -> const Expression*;
auto MakeBool(int line_num, bool b) -> const Expression*;
auto MakeOp(int line_num, Operator op, std::vector<const Expression*>* args)
-> const Expression*;
auto MakeUnOp(int line_num, enum Operator op, const Expression* arg)
-> const Expression*;
auto MakeBinOp(int line_num, enum Operator op, const Expression* arg1,
const Expression* arg2) -> const Expression*;
auto MakeCall(int line_num, const Expression* fun, const Expression* arg)
-> const Expression*;
auto MakeGetField(int line_num, const Expression* exp, std::string field)
-> const Expression*;
auto MakeTuple(int line_num, std::vector<FieldInitializer>* args)
-> const Expression*;
// Create an AST node for an empty tuple.
auto MakeUnit(int line_num) -> const Expression*;
auto MakeIndex(int line_num, const Expression* exp, const Expression* i)
-> const Expression*;
auto MakeTypeType(int line_num) -> const Expression*;
auto MakeIntType(int line_num) -> const Expression*;
auto MakeBoolType(int line_num) -> const Expression*;
auto MakeFunType(int line_num, const Expression* param, const Expression* ret)
-> const Expression*;
auto MakeAutoType(int line_num) -> const Expression*;
// Returns a Continuation type AST node at the given source location,
// which is the type of a continuation value.
auto MakeContinuationType(int line_num) -> const Expression*;
void PrintExp(const Expression* exp);
} // namespace Carbon