typedef enum {
AST_VAR, AST_FUNC, AST_EXPLIST, AST_IF, AST_APPLY,
AST_STRING, AST_SYMBOL, AST_CHAR, AST_INT,
- AST_FLOAT, AST_BOOL, AST_IDENT
+ AST_FLOAT, AST_BOOL, AST_IDENT, AST_OPER
} ASTType;
typedef struct AST {
Type* datatype;
union {
struct AST* nodes[3];
+ struct {
+ int oper;
+ struct AST* left;
+ struct AST* right;
+ } op;
/* Definition Node */
struct {
char* name;
AST* apply_func(AST* apply);
AST* apply_args(AST* apply);
+AST* OpCall(int oper, AST* left, AST* right);
+
+
/* Package Definition
*****************************************************************************/
typedef struct Require {
static AST* definition(Parser* p);
static AST* type_definition(Parser* p);
static AST* func_definition(Parser* p);
-static AST* expression(Parser* p);
+static AST* expression(Parser* p, int level);
static AST* constant(Parser* p);
static AST* type_expression(Parser* p);
static AST* struct_fields(Parser* p);
#define parse_exit()
#endif
-uint8_t PrefixOps[T_COUNT] = {
+int8_t PrefixOps[T_COUNT] = {
[T_IF] = 1,
['{'] = 1,
['('] = 1,
};
-uint8_t BinaryOps[T_COUNT] = {
+int8_t BinaryOps[T_COUNT] = {
['.'] = 1,
['('] = 1,
};
char* str = strdup(expect_val(p, T_ID)->text);
AST* type = type_expression(p);
expect(p, '=');
- AST* val = expression(p);
+ AST* val = expression(p, 1);
parse_exit();
return Var(str, val, type, SF_CONSTANT);
}
return Var(name, func, type, SF_CONSTANT);
}
-static AST* expression(Parser* p) {
- parse_enter();
- int precedence = PrefixOps[peek(p)->type];
+/*
+function parseExpressionAtPrecedence(currentPrecedence) {
+ expr = parseExpressionAtom()
+ while op = parseOperator() && op.precedence < currentPrecedence {
+ if op.rightAssociative {
+ b = parseExpressionAtPrecedence(op.precedence)
+ } else {
+ b = parseExpressionAtPrecedence(op.precedence + 1)
+ }
+ expr = OperatorExpression(op, expr, b)
+ }
+ return expr
+}
+*/
+
+static AST* expression(Parser* p, int level) {
AST* left = prefix_expr(p);
- int next = peek(p)->type;
- while (BinaryOps[next] && BinaryOps[next] >= precedence) {
- left = binary_expr(p, left);
- next = peek(p)->type;
+ int oper = peek(p)->type;
+ while (BinaryOps[oper] && abs(BinaryOps[oper]) < level) {
+ AST* right;
+ expect(p, oper); // consume the operator
+ if (BinaryOps[oper] < 0)
+ right = expression(p, level+1);
+ else
+ right = expression(p, level);
+ left = OpCall(oper, left, right);
+ oper = peek(p)->type; // get next operator
}
- parse_exit();
return left;
}
+//static AST* expression(Parser* p) {
+// parse_enter();
+// int precedence = PrefixOps[peek(p)->type];
+// AST* left = prefix_expr(p);
+// int next = peek(p)->type;
+// while (BinaryOps[next] && BinaryOps[next] >= precedence) {
+// left = binary_expr(p, left);
+// next = peek(p)->type;
+// }
+// parse_exit();
+// return left;
+//}
+
static AST* prefix_expr(Parser* p) {
AST* tree = NULL;
Tok* tok = peek(p);
switch ((int)tok->type) {
case '(':
expect(p, '(');
- tree = expression(p);
+ tree = expression(p, 1);
expect(p, ')');
break;
case '[':
} else if (matches(p, T_FUN)) {
expr = func_definition(p);
} else {
- expr = expression(p);
+ expr = expression(p, 1);
}
explist_append(list, expr);
}
static AST* if_expression(Parser* p) {
AST *cond = 0, *b1 = 0, *b2 = 0;
expect(p, T_IF);
- cond = expression(p); // condition
- b1 = expression(p); // true branch
+ cond = expression(p, 1); // condition
+ b1 = expression(p, 1); // true branch
if (accept(p, T_ELSE)) {
- b2 = expression(p); // false branch
+ b2 = expression(p, 1); // false branch
}
return If(cond, b1, b2);
}
expect(p, firstc);
AST* list = ExpList();
while (!matches(p, endc)) {
- explist_append(list, expression(p));
+ explist_append(list, expression(p, 1));
if (!matches(p, endc)) {
expect(p, ',');
if (matches(p, endc))