57 lines
1.3 KiB
C
57 lines
1.3 KiB
C
#include"ast.h"
|
|
|
|
#include<stdint.h>
|
|
#include<string.h>
|
|
#include<stdlib.h>
|
|
|
|
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;
|
|
} |