]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
stubbed out struct and union parsing
authorMichael D. Lowis <mike@mdlowis.com>
Mon, 18 Jun 2018 01:47:06 +0000 (21:47 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Mon, 18 Jun 2018 01:47:06 +0000 (21:47 -0400)
example.src
source/lexer.l
source/parser.c
source/sclpl.h

index 1b023c88e6f15bca66502661a5cd1b53e897a088..2ce3f219f22d609e8dce3b9998642e30be97f994 100644 (file)
@@ -12,6 +12,8 @@ var const_uint int = 123;
 var const_string string = "";
 
 type type_int = int;
+type type_struct = struct;
+type type_union = union;
 # type type_intary int[]
 # type type_intary42 int[42]
 # type type_intaryary int[][]
index 9916d4b99280352b3346500670183e8c4ffb4233..7276a7afcf016406239b2e1d377b06499a56c955 100644 (file)
@@ -35,10 +35,12 @@ NOSPACE [^ \t\r\n]
 
 "require" { return T_REQUIRES;  }
 "provide" { return T_PROVIDES;  }
-"let"      { return T_LET;      }
-"var"      { return T_VAR;      }
-"fun"      { return T_FUN;      }
-"type"     { return T_TYPE;     }
+"let"     { return T_LET;       }
+"var"     { return T_VAR;       }
+"fun"     { return T_FUN;       }
+"type"    { return T_TYPE;      }
+"struct"  { return T_STRUCT;    }
+"union"   { return T_UNION;     }
 
 "if"   { return T_IF;     }
 "else" { return T_ELSE;   }
index 10952db6c01713d6255aabf4ef252eae9d6d8fb7..23f5c3bd3ab58019b69cce2ab04fc9be2d71cae2 100644 (file)
@@ -70,12 +70,10 @@ static Tok* expect_val(Parser* p, TokType type) {
 /* Grammar Definition
  *****************************************************************************/
 AST* toplevel(Parser* p) {
-    if (matches(p, T_REQUIRES)) {
+    if (matches(p, T_REQUIRES))
         require_list(p);
-    }
-    if (matches(p, T_PROVIDES)) {
+    if (matches(p, T_PROVIDES))
         provide_list(p);
-    }
     definition_list(p);
     return NULL;
 }
@@ -160,7 +158,13 @@ static AST* const_expression(Parser* p) {
 }
 
 static AST* type_expression(Parser* p) {
-    expect(p, T_ID);
+    if (matches(p, T_STRUCT)) {
+        expect(p, T_STRUCT);
+    } else if (matches(p, T_UNION)) {
+        expect(p, T_UNION);
+    } else {
+        expect(p, T_ID);
+    }
     return NULL;
 }
 
index 7c8d3a9f3b81df501b944c4e532ce9c46a4d2d03..6d9c8f468ee6ff652d55af43df68a83532cb72c6 100644 (file)
@@ -41,7 +41,8 @@ void vec_set(vec_t* vec, size_t index, void* data);
  *****************************************************************************/
 typedef enum {
     T_NONE, T_ERROR, T_END_FILE,
-    T_PACKAGE, T_REQUIRES, T_PROVIDES, T_LET, T_VAR, T_FUN, T_TYPE,
+    T_PACKAGE, T_REQUIRES, T_PROVIDES, T_LET, T_VAR, T_FUN, T_TYPE, T_STRUCT,
+    T_UNION,
     T_ID, T_CHAR, T_INT, T_FLOAT, T_BOOL, T_STRING,
     T_LBRACE, T_RBRACE, T_LBRACK, T_RBRACK, T_LPAR, T_RPAR, T_COMMA, T_SQUOTE,
     T_DQUOTE, T_COLON, T_AMP, T_IF, T_ELSE, T_ASSIGN, T_SEMI