intptr_t temp_value(AST* val)
{
assert(val != NULL);
- assert(val->type == AST_TEMP);
return val->value.integer;
}
return val->value.text;
}
-AST* Def(Tok* name, AST* value)
+AST* Let(Tok* name, AST* value)
{
- AST* node = ast(AST_DEF);
- node->value.def.name = name->value.text;
- node->value.def.value = value;
+ AST* node = ast(AST_LET);
+ node->value.let.name = name->value.text;
+ node->value.let.value = value;
return node;
}
-char* def_name(AST* def)
+char* let_name(AST* let)
{
- assert(def != NULL);
- assert(def->type == AST_DEF);
- return def->value.def.name;
+ assert(let != NULL);
+ assert(let->type == AST_LET);
+ return let->value.let.name;
}
-AST* def_value(AST* def)
+AST* let_value(AST* let)
{
- assert(def != NULL);
- assert(def->type == AST_DEF);
- return def->value.def.value;
-}
-
-AST* IfExpr(void)
-{
- return ast(AST_IF);
-}
-
-AST* ifexpr_cond(AST* ifexpr)
-{
- return ifexpr->value.ifexpr.cond;
-}
-
-void ifexpr_set_cond(AST* ifexpr, AST* cond)
-{
- ifexpr->value.ifexpr.cond = cond;
-}
-
-AST* ifexpr_then(AST* ifexpr)
-{
- return ifexpr->value.ifexpr.bthen;
-}
-
-void ifexpr_set_then(AST* ifexpr, AST* bthen)
-{
- ifexpr->value.ifexpr.bthen = bthen;
-}
-
-AST* ifexpr_else(AST* ifexpr)
-{
- return ifexpr->value.ifexpr.belse;
-}
-
-void ifexpr_set_else(AST* ifexpr, AST* belse)
-{
- ifexpr->value.ifexpr.belse = belse;
-}
-
-AST* Func(void)
-{
- AST* node = ast(AST_FUNC);
- vec_init(&(node->value.func.args));
- node->value.func.body = NULL;
- return node;
-}
-
-vec_t* func_args(AST* func)
-{
- return &(func->value.func.args);
-}
-
-AST* func_body(AST* func)
-{
- return func->value.func.body;
-}
-
-void func_add_arg(AST* func, AST* arg)
-{
- vec_push_back(func_args(func), arg);
-}
-
-void func_set_body(AST* func, AST* body)
-{
- func->value.func.body = body;
-}
-
-AST* FnApp(AST* fnapp)
-{
- AST* node = ast(AST_FNAPP);
- node->value.fnapp.fn = fnapp;
- vec_init(&(node->value.fnapp.args));
- return node;
-}
-
-void fnapp_set_fn(AST* fnapp, AST* fn)
-{
- AST* old = fnapp->value.fnapp.fn;
- fnapp->value.fnapp.fn = fn;
-}
-
-AST* fnapp_fn(AST* fnapp)
-{
- return fnapp->value.fnapp.fn;
-}
-
-vec_t* fnapp_args(AST* fnapp)
-{
- return &(fnapp->value.fnapp.args);
-}
-
-void fnapp_add_arg(AST* fnapp, AST* arg)
-{
- vec_push_back(&(fnapp->value.fnapp.args), arg);
+ assert(let != NULL);
+ assert(let->type == AST_LET);
+ return let->value.let.value;
}
expr = const_expression(p);
expect(p, T_END);
// }
- return Def(id, expr);
+ return Let(id, expr);
}
static AST* const_expression(Parser* p) {
}
}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#if 0
static AST* definition(Parser* p) {
-/**
- @file prettyprint.c
- @brief See header for details
- $Revision$
- $HeadURL$
- */
#include <sclpl.h>
static void print_indent(FILE* file, int depth) {
case AST_INT: return "T_INT";
case AST_FLOAT: return "T_FLOAT";
case AST_BOOL: return "T_BOOL";
- case AST_TEMP: return "$";
default: return "???";
}
}
case AST_CHAR: printf("%c", char_value(tree)); break;
case AST_INT: printf("%ld", integer_value(tree)); break;
case AST_FLOAT: printf("%lf", float_value(tree)); break;
- case AST_TEMP: printf("%ld", temp_value(tree)); break;
case AST_BOOL:
printf("%s", bool_value(tree) ? "true" : "false");
break;
}
print_indent(file, depth);
switch (tree->type) {
- case AST_REQ:
- printf("(require \"%s\")", require_name(tree));
- break;
-
- case AST_DEF:
- printf("(let %s ", def_name(tree));
- pprint_tree(file, def_value(tree), depth);
- printf(")");
- break;
-
- case AST_IF:
- printf("(if ");
- pprint_tree(file, ifexpr_cond(tree), depth);
- printf(" ");
- pprint_tree(file, ifexpr_then(tree), depth);
- printf(" ");
- pprint_tree(file, ifexpr_else(tree), depth);
- printf(")");
- break;
-
- case AST_FUNC:
- printf("(fn (");
- for (size_t i = 0; i < vec_size(func_args(tree)); i++) {
- printf(" ");
- pprint_literal(file, vec_at(func_args(tree), i), depth);
- }
- printf(")");
- pprint_tree(file, func_body(tree), depth);
- printf(")");
- break;
-
- case AST_FNAPP:
- printf("(");
- pprint_tree(file, fnapp_fn(tree), depth);
- for (size_t i = 0; i < vec_size(fnapp_args(tree)); i++) {
- printf(" ");
- pprint_tree(file, vec_at(fnapp_args(tree), i), depth);
- }
- printf(")");
- break;
-
case AST_LET:
- printf("(let (");
- pprint_tree(file, let_var(tree), depth);
- printf(" ");
- pprint_tree(file, let_val(tree), depth);
- printf(") ");
- pprint_tree(file, let_body(tree), depth);
+ printf("(let %s ", let_name(tree));
+ pprint_tree(file, let_value(tree), depth);
printf(")");
break;
/* AST Types
*****************************************************************************/
typedef enum {
- AST_STRING, AST_SYMBOL, AST_CHAR, AST_INT, AST_FLOAT, AST_BOOL, AST_IDENT,
- AST_DEF, AST_IF, AST_FUNC, AST_FNAPP
+ AST_LET, AST_STRING, AST_SYMBOL, AST_CHAR, AST_INT, AST_FLOAT, AST_BOOL, AST_IDENT
} ASTType;
typedef struct AST {
char* name;
struct AST* type;
struct AST* value;
- } def;
- /* If Expression */
- struct {
- struct AST* cond;
- struct AST* bthen;
- struct AST* belse;
- } ifexpr;
- /* Function */
- struct {
- vec_t args;
- struct AST* body;
- } func;
- /* Function Application */
- struct {
- struct AST* fn;
- vec_t args;
- } fnapp;
+ } let;
/* String, Symbol, Identifier */
char* text;
/* Character */
char* ident_value(AST* val);
/* Definition */
-AST* Def(Tok* name, AST* value);
-char* def_name(AST* def);
-AST* def_value(AST* def);
-
-/* If Expression */
-AST* IfExpr(void);
-AST* ifexpr_cond(AST* ifexpr);
-void ifexpr_set_cond(AST* ifexpr, AST* cond);
-AST* ifexpr_then(AST* ifexpr);
-void ifexpr_set_then(AST* ifexpr, AST* bthen);
-AST* ifexpr_else(AST* ifexpr);
-void ifexpr_set_else(AST* ifexpr, AST* belse);
-
-/* Function */
-AST* Func(void);
-vec_t* func_args(AST* func);
-AST* func_body(AST* func);
-void func_add_arg(AST* func, AST* arg);
-void func_set_body(AST* func, AST* body);
-
-/* Function Application */
-AST* FnApp(AST* fn);
-AST* fnapp_fn(AST* fnapp);
-void fnapp_set_fn(AST* fnapp, AST* fn);
-vec_t* fnapp_args(AST* fnapp);
-void fnapp_add_arg(AST* func, AST* arg);
+AST* Let(Tok* name, AST* value);
+char* let_name(AST* let);
+AST* let_value(AST* let);
/* Pretty Printing
*****************************************************************************/