#include"ast.h" #include #include #include AST *ast_expression_optimize(AST *ast) { return ast; } int ast_expression_equal(AST *a, AST *b) { if(a->nodeKind != b->nodeKind) return 0; if(a->nodeKind == AST_EXPR_PRIMITIVE) { return a->exprPrim.val == b->exprPrim.val; } else if(a->nodeKind == AST_EXPR_VAR) { return a->exprVar.thing == b->exprVar.thing; } else if(a->nodeKind == AST_EXPR_UNARY_OP) { return a->exprUnOp.operator == b->exprUnOp.operator && ast_expression_equal(a->exprUnOp.operand, b->exprUnOp.operand); } else if(a->nodeKind == AST_EXPR_BINARY_OP) { return a->exprBinOp.operator == b->exprBinOp.operator && ast_expression_equal(a->exprBinOp.operands[0], b->exprBinOp.operands[0]) && ast_expression_equal(a->exprBinOp.operands[1], b->exprBinOp.operands[1]); } return 0; } // ... Ew int ast_stmt_is_after(const AST *chunk, const AST *s1, const AST *s2) { const AST *s = chunk->chunk.statementFirst; while(s) { if(s->nodeKind == AST_STMT_LOOP) { int i = ast_stmt_is_after(s->stmtLoop.body, s1, s2); if(i != -1) { return i; } } if(s == s1) { return 0; } if(s == s2) { return 1; } if(s->nodeKind == AST_STMT_IF) { int i = ast_stmt_is_after(s->stmtIf.then, s1, s2); if(i != -1) { return i; } } s = s->statement.next; } return -1; }