return def->value.def.value;
}
+AST* Block(void)
+{
+ return NULL;
+}
+
+void block_append(AST* block, AST* expr)
+{
+
+}
+
+size_t block_size(AST* block)
+{
+ return 0;
+}
+
+AST* block_get(size_t index)
+{
+ return NULL;
+}
+
+
+
+
+
//AST* Ann(char* name, AST* value)
//{
// (void)name;
static AST* require(Parser* p);
static AST* definition(Parser* p);
static AST* expression(Parser* p);
+static AST* if_stmnt(Parser* p);
static AST* literal(Parser* p);
+static AST* expr_block(Parser* p);
static AST* token_to_tree(Tok* tok);
AST* toplevel(Parser* p)
// return type_definition(p);
//else if (accept_str(p, T_ID, "ann"))
// return type_annotation(p);
- //else if (accept_str(p, T_ID, "def"))
- // return definition(p);
- //else
- // return expression(p);
return ret;
}
static AST* expression(Parser* p)
{
if (peek(p)->type == T_ID) {
- return Ident(expect(p,T_ID)); //expect_lit(p, T_ID);
+ return Ident(expect(p,T_ID));
//if (peek(p)->type == T_LPAR) {
// arglist(p);
//}
+ } else if (accept_str(p, T_ID, "if")) {
+ return if_stmnt(p);
} else {
return literal(p);
}
// expression(p);
// expect(p, T_RPAR);
// //reduce(p, mrk);
- //} else if (accept_str(p, T_ID, "if")) {
- // if_stmnt(p);
//} else if (accept_str(p, T_ID, "fn")) {
// fn_stmnt(p);
//} else if (peek(p)->type == T_ID) {
// if (peek(p)->type == T_LPAR) {
// arglist(p);
// }
- //} else {
- // return literal(p);
- //}
+}
+
+static AST* if_stmnt(Parser* p)
+{
+ //AST* ifexpr = IfExpr();
+ //ifexpr_set_condition( expression(p) );
+ //ifexpr_set_branch_then( expr_block(p) );
+ //expect(p,T_END);
+ //return ifexpr;
+ return NULL;
}
static AST* literal(Parser* p)
return ret;
}
+static AST* expr_block(Parser* p)
+{
+ AST* block = Block();
+ do {
+ block_append(block, expression(p));
+ } while(!accept_str(p, T_ID, "else") && !accept(p, T_END));
+ return block;
+}
+
static AST* token_to_tree(Tok* tok)
{
switch (tok->type) {
return NULL;
}
-static AST* if_stmnt(Parser* p)
-{
- ////size_t mrk = mark(p);
- //expression(p);
- //expression(p);
- //if (accept_str(p, T_ID, "else")) {
- // expression(p);
- //}
- //expect(p,T_END);
- ////reduce(p, mrk);
- return NULL;
-}
static AST* fn_stmnt(Parser* p)
{
// Redfine main
extern int user_main(int argc, char** argv);
+/* Vector Implementation
+ *****************************************************************************/
+typedef struct {
+ size_t count;
+ size_t size;
+ size_t capacity;
+ void** buffer;
+} vec_t;
+
+void vec_init(vec_t* vec);
+void vec_deinit(vec_t* vec);
+void vec_clear(vec_t* vec);
+size_t vec_size(vec_t* vec);
+void* vec_at(vec_t* vec, size_t index);
+void vec_push_back(vec_t* vec, void* data);
+
/* Token Types
*****************************************************************************/
typedef enum {
char* def_name(AST* def);
AST* def_value(AST* def);
+/* If Expression */
+AST* IfExpr(AST* cond, AST* bthen, AST* belse);
+AST* ifexpr_condition(AST* ifexpr);
+AST* ifexpr_branch_then(AST* ifexpr);
+AST* ifexpr_branch_else(AST* ifexpr);
-
+/* Code Block */
+AST* Block(void);
+void block_append(AST* block, AST* expr);
+size_t block_size(AST* block);
+AST* block_get(size_t index);
//char* ann_name(AST* def);
//AST* ann_value(AST* def);
//
-///* If Expression */
-//AST* IfExpr(AST* cond, AST* bthen, AST* belse);
-//AST* ifexpr_condition(AST* ifexpr);
-//AST* ifexpr_branch_then(AST* ifexpr);
-//AST* ifexpr_branch_else(AST* ifexpr);
//
///* Function */
//AST* Func(AST* args, AST* body);
//AST* func_args(AST* func);
//AST* func_body(AST* func);
//
-///* Code Block */
-//AST* Block(void);
-//void block_append(AST* expr);
-//size_t block_size(AST* block);
-//AST* block_get(size_t index);
//
/* Lexer and Parser Types
*****************************************************************************/
--- /dev/null
+/**
+ @file vec.c
+*/
+#include <sclpl.h>
+
+#ifndef DEFAULT_VEC_CAPACITY
+#define DEFAULT_VEC_CAPACITY (size_t)8
+#endif
+
+void vec_init(vec_t* vec)
+{
+ vec->count = 0;
+ vec->capacity = DEFAULT_VEC_CAPACITY;
+ vec->buffer = malloc(sizeof(void*) * vec->capacity);
+}
+
+void vec_deinit(vec_t* vec)
+{
+ vec_clear(vec);
+ free(vec->buffer);
+}
+
+size_t vec_size(vec_t* vec)
+{
+ return vec->count;
+}
+
+void* vec_at(vec_t* vec, size_t index)
+{
+ assert(index < vec->count);
+ return vec->buffer[index];
+}
+
+static void vec_reserve(vec_t* vec, size_t size)
+{
+ assert(vec != NULL);
+ vec->buffer = realloc( vec->buffer, sizeof(void*) * size );
+ assert(vec->buffer != NULL);
+ vec->capacity = size;
+}
+
+static size_t vec_next_capacity(size_t req_size)
+{
+ size_t next_power = req_size;
+ size_t num_bits = sizeof(size_t) * 8;
+ size_t bit_n;
+ /* Find the next highest power of 2 */
+ next_power--;
+ for (bit_n = 1; bit_n < num_bits; bit_n = bit_n << 1)
+ {
+ next_power = next_power | (next_power >> bit_n);
+ }
+ next_power++;
+ return next_power;
+}
+
+static void vec_resize(vec_t* vec, size_t count, void* fillval)
+{
+ if (count > vec->count) {
+ vec_reserve(vec, vec_next_capacity(count+1));
+ for (; vec->count < count; vec->count++)
+ vec->buffer[vec->count] = gc_addref(fillval);
+ } else if (count < vec->count) {
+ vec->count = count;
+ }
+}
+
+void vec_push_back(vec_t* vec, void* data)
+{
+ vec_resize(vec, vec->count+1, data);
+}
+
+void vec_set(vec_t* vec, size_t index, void* data)
+{
+ assert(index < vec->count);
+ gc_swapref((void**)&(vec->buffer[index]), data);
+}
+
+void vec_clear(vec_t* vec)
+{
+ for (size_t i = 0; i < vec->count; i++)
+ gc_delref(vec->buffer[i]);
+ vec->count = 0;
+}
+