История изменений
Исправление
MOPKOBKA,
(текущая версия)
:
Если представить ADT по наиболее краткой модели для C/C++ в виде struct { enum; union; }, то вот такое условие с одним OR
match ast_node with
| Ast.AddOp (Ast.Num x, Ast.IncOp (Ast.Var name))
| Ast.AddOp (Ast.IncOp (Ast.Var name), Ast.Num x) when x > 10 ->
... code ...
bool if_true = false;
std::string name;
int x;
if (ast_node.kind == Ast::ADD_OP) {
if (ast_node.add_op.left.kind == Ast::NUM) {
if (ast_node.add_op.right.kind == Ast::INC_OP) {
if (ast_node.add_op.right.inc_op.value.kind == Ast::VAR) {
x = ast_node.add_op.left.num.value;
name = ast_node.add_op.right.inc_op.value.var.name;
if_true = true;
}
}
}
}
if (ast_node.kind == Ast::ADD_OP) {
if (ast_node.add_op.right.kind == Ast::NUM) {
if (ast_node.add_op.left.kind == Ast::INC_OP) {
if (ast_node.add_op.left.inc_op.value.kind == Ast::VAR) {
x = ast_node.add_op.right.num.value;
name = ast_node.add_op.left.inc_op.value.var.name;
if_true = true;
}
}
}
}
if (if_true && x > 10) {
... code ...
}
Исправление
MOPKOBKA,
:
Если представить ADT по наиболее краткой модели для C/C++ в виде struct { enum; union; }, то вот такое условие с одним OR
match ast_node with
| Ast.AddOp (Ast.Num x, Ast.IncOp (Ast.Var name))
| Ast.AddOp (Ast.IncOp (Ast.Var name), Ast.Num x) when x > 10 ->
... code ...
bool if_true = false;
std::string name;
int x;
if (ast_node.kind == Ast::ADD_OP) {
if (ast_node.add_op.left.kind == Ast::NUM) {
if (ast_node.add_op.right.kind == Ast::INC_OP) {
if (ast_node.add_op.right.inc_op.value.kind == Ast::VAR) {
x = ast_node.add_op.left.num.value;
name = ast_node.add_op.right.inc_op.value.var.name;
if_true = true;
}
}
}
}
if (ast_node.kind == Ast::ADD_OP) {
if (ast_node.add_op.right.kind == Ast::NUM) {
if (ast_node.add_op.left.kind == Ast::INC_OP) {
if (ast_node.add_op.left.inc_op.value.kind == Ast::VAR) {
x = ast_node.add_op.right.num.value;
name = ast_node.add_op.left.inc_op.value.var.name;
if_true = true;
}
}
}
}
if (if_true && x > 10) {
... code ...
}
Исходная версия
MOPKOBKA,
:
Если представить ADT по наиболее краткой модели для C/C++ в виде struct { enum; union; }, то вот такое условие с одним OR
match ast_node with
| Ast.AddOp (Ast.Num x, Ast.IncOp (Ast.Var name))
| Ast.AddOp (Ast.IncOp (Ast.Var name), Ast.Num x) when x > 10 ->
... code ...
bool if_true = false;
std::string name;
int x;
if (ast_node.kind == Ast::ADD_OP) {
if (ast_node.add_op.left.kind == Ast::NUM) {
if (ast_node.add_op.right.kind == Ast::INC_OP) {
if (ast_node.add_op.right.inc_op.value.kind == Ast::VAR) {
x = ast_node.add_op.left.num.value;
name = ast_node.add_op.right.inc_op.value.var.name;
if_true = true;
}
}
}
}
if (ast_node.kind == Ast::ADD_OP) {
if (ast_node.add_op.right.kind == Ast::NUM) {
if (ast_node.add_op.left.kind == Ast::INC_OP) {
if (ast_node.add_op.left.inc_op.value.kind == Ast::VAR) {
x = ast_node.add_op.right.num.value;
name = ast_node.add_op.left.inc_op.value.var.name;
if_true = true;
}
}
}
}
if (if_true) {
... code ...
}