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 = (AST*)gc_addref(cond);
+}
+
+AST* ifexpr_then(AST* ifexpr)
+{
+ return ifexpr->value.ifexpr.bthen;
+}
+
+void ifexpr_set_then(AST* ifexpr, AST* bthen)
+{
+ ifexpr->value.ifexpr.cond = (AST*)gc_addref(bthen);
+}
+
+AST* ifexpr_else(AST* ifexpr)
+{
+ return ifexpr->value.ifexpr.belse;
+}
+
+void ifexpr_set_else(AST* ifexpr, AST* belse)
+{
+ ifexpr->value.ifexpr.cond = (AST*)gc_addref(belse);
+}
+
AST* Block(void)
{
- return NULL;
+ return ast(AST_BLOCK);
}
void block_append(AST* block, AST* expr)
{
-
}
size_t block_size(AST* block)
return 0;
}
-AST* block_get(size_t index)
+AST* block_get(AST* block, size_t index)
{
return NULL;
}
AST* toplevel(Parser* p)
{
AST* ret = NULL;
- if (peek(p)->type != T_END_FILE) {
+ if (!match(p, T_END_FILE)) {
if (accept_str(p, T_ID, "require"))
ret = require(p);
else if (accept_str(p, T_ID, "def"))
static AST* expression(Parser* p)
{
- if (peek(p)->type == T_ID) {
+ if (match(p, T_ID)) {
return Ident(expect(p,T_ID));
//if (peek(p)->type == T_LPAR) {
// arglist(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;
+ AST* ifexpr = IfExpr();
+ ifexpr_set_cond( ifexpr, expression(p) );
+ ifexpr_set_then( ifexpr, expr_block(p) );
+ if (accept_str(p, T_ID, "else"))
+ ifexpr_set_else( ifexpr, expr_block(p) );
+ expect(p,T_END);
+ return ifexpr;
}
static AST* literal(Parser* p)
AST* block = Block();
do {
block_append(block, expression(p));
- } while(!accept_str(p, T_ID, "else") && !accept(p, T_END));
+ } while(!match(p, T_END) && !match_str(p, T_ID, "else"));
return block;
}
exit(1);
}
+bool match(Parser* parser, TokType type)
+{
+ return (peek(parser)->type == type);
+}
+
+bool match_str(Parser* parser, TokType type, const char* text)
+{
+ return (match(parser, type) &&
+ (0 == strcmp((char*)(peek(parser)->value.text), text)));
+}
+
Tok* accept(Parser* parser, TokType type)
{
Tok* tok = peek(parser);
*****************************************************************************/
typedef enum ASTType {
AST_STRING = 0, AST_SYMBOL, AST_CHAR, AST_INT, AST_FLOAT, AST_BOOL, AST_IDENT,
- AST_REQ, AST_DEF, AST_ANN, AST_IF, AST_FUNC,
+ AST_REQ, AST_DEF, AST_ANN, AST_IF, AST_FUNC, AST_BLOCK
} ASTType;
typedef struct AST {
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);
+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);
/* Code Block */
AST* Block(void);
void block_append(AST* block, AST* expr);
size_t block_size(AST* block);
-AST* block_get(size_t index);
+AST* block_get(AST* block, size_t index);
bool parser_eof(Parser* p_parser);
void parser_resume(Parser* p_parser);
void error(Parser* p_parser, const char* p_text);
+bool match(Parser* parser, TokType type);
+bool match_str(Parser* parser, TokType type, const char* text);
Tok* accept(Parser* p_parser, TokType type);
Tok* accept_str(Parser* p_parser, TokType type, const char* p_text);
Tok* expect(Parser* p_parser, TokType type);