]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
Added ast functions for if statments and blocks
authorMike D. Lowis <mike.lowis@gentex.com>
Wed, 14 Oct 2015 00:24:44 +0000 (20:24 -0400)
committerMike D. Lowis <mike.lowis@gentex.com>
Wed, 14 Oct 2015 00:24:44 +0000 (20:24 -0400)
source/ast.c
source/grammar.c
source/parser.c
source/sclpl.h

index 822c04293cff5259a9d82e6a7e53bb59ad616116..45120d7dfabc992f4a2db4031fdd70a88cc41c54 100644 (file)
@@ -181,14 +181,48 @@ AST* def_value(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 = (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)
@@ -196,7 +230,7 @@ size_t block_size(AST* block)
     return 0;
 }
 
-AST* block_get(size_t index)
+AST* block_get(AST* block, size_t index)
 {
     return NULL;
 }
index 958ab42512c0b1d9749db87290e3014003fa939c..83acff6d591af6141ddd0d2d005d64a162c85dc0 100644 (file)
@@ -17,7 +17,7 @@ static AST* token_to_tree(Tok* tok);
 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"))
@@ -55,7 +55,7 @@ static AST* require(Parser* p)
 
 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);
@@ -82,12 +82,13 @@ static AST* expression(Parser* 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)
@@ -113,7 +114,7 @@ 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));
+    } while(!match(p, T_END) && !match_str(p, T_ID, "else"));
     return block;
 }
 
index d252131bec9cf5f68002b595edf8407cb551f0bf..a058bf8a6542baa5fa0552451185630b07de917a 100644 (file)
@@ -64,6 +64,17 @@ void error(Parser* parser, const char* text)
     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);
index 8982f33eb38255c1e345f7537b45c531738a897b..b13c4c1d6d324bfca4580c0e1c8f8219de3b41ac 100644 (file)
@@ -73,7 +73,7 @@ typedef struct {
  *****************************************************************************/
 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 {
@@ -155,16 +155,19 @@ 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);
+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);
 
 
 
@@ -202,6 +205,8 @@ Tok* peek(Parser* p_parser);
 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);