]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
whoops.
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 19 Jun 2018 02:48:27 +0000 (22:48 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 19 Jun 2018 02:48:27 +0000 (22:48 -0400)
1  2 
example.src
source/lexer.l
source/parser.c
source/pprint.c
source/sclpl.h

diff --cc example.src
index 2ce3f219f22d609e8dce3b9998642e30be97f994,2875d24e4c6ef170b3cb9b096f874332448137aa..269ce457b212d8de6564123090d7776bab169d8f
@@@ -6,26 -6,26 +6,33 @@@ let const_false bool = false
  let const_uint int = 123;
  let const_string string = "";
  
- var const_true bool = true;
- var const_false bool = false;
- var const_uint int = 123;
- var const_string string = "";
+ var var_true bool = true;
+ var var_false bool = false;
+ var var_uint int = 123;
+ var var_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[][]
- # type type_intptrary int*[]
- # type type_intrefary int&[]
- # type type_intptr int*
- # type type_intptrptr int**
- # type type_intref int&
+ type type_intary = int[];
+ type type_intaryary = int[][];
+ type type_intptrary = int*[];
+ type type_intptr = int*;
+ type type_intptrptr = int**;
+ type type_struct = struct {
+     foo = int;
+     bar = float;
+ };
+ type type_union = union {
+     foo = int;
+     bar = float;
+ };
  
  fun main() int {
++    let foo int = 123;
++    var bar int = 123;
++    {}
++    {123;}
++    123;
++    (123);
++    return bar;
  }
  
diff --cc source/lexer.l
index 7276a7afcf016406239b2e1d377b06499a56c955,2a7eba6079a77d29911b972a8eed73ba4f5e5b78..22dc4e9cb95d04f63872faca8982e696b58badb9
@@@ -30,32 -30,33 +30,34 @@@ NOSPACE [^ \t\r\n
  
  %%
  
- [ \t\r\n] { /* whitespace is insignificant */ }
- #.*[\r\n] { /* skip line comments */ }
- "require" { return T_REQUIRES;  }
- "provide" { return T_PROVIDES;  }
- "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;   }
- "("    { return T_LPAR;   }
- ")"    { return T_RPAR;   }
- "["    { return T_LBRACK; }
- "]"    { return T_RBRACK; }
- "{"    { return T_LBRACE; }
- "}"    { return T_RBRACE; }
- ","    { return T_COMMA;  }
- "'"    { return T_SQUOTE; }
- ":"    { return T_COLON;  }
- "&"    { return T_AMP;    }
- "="    { return T_ASSIGN; }
- ";"    { return T_SEMI;   }
+ "\r\n"    { yylineno++; }
+ "\n"      { yylineno++; }
+ #.*[\r\n] { yylineno++; }
+ [ \t]     { /* whitespace is insignificant */ }
+ "require" { return T_REQUIRES; }
+ "provide" { return T_PROVIDES; }
+ "let"     { return T_LET;      }
+ "var"     { return T_VAR;      }
+ "fun"     { return T_FUN;      }
+ "type"    { return T_TYPE;     }
+ "struct"  { return T_STRUCT;   }
+ "union"   { return T_UNION;    }
++"return"  { return T_RETURN;   }
+ "("    { return '(';    }
+ ")"    { return ')';    }
+ "["    { return '[';    }
+ "]"    { return ']';    }
+ "{"    { return '{';    }
+ "}"    { return '}';    }
+ ","    { return ',';    }
+ "'"    { return '\'';   }
+ ":"    { return ':';    }
+ "&"    { return '&';    }
+ "="    { return '=';    }
+ ";"    { return ';';    }
+ "*"    { return '*';    }
  
  \\.       { Value.character = yytext[1];    return T_CHAR; }
  \\space   { Value.character = ' ';          return T_CHAR; }
diff --cc source/parser.c
index 23f5c3bd3ab58019b69cce2ab04fc9be2d71cae2,cf15f76064182d949a536caeeee7519e0f0fd2bd..60f0feb319336158752508e46adbd144b484ec10
@@@ -8,9 -8,10 +8,13 @@@ static AST* const_definition(Parser* p
  static AST* type_definition(Parser* p);
  static AST* func_definition(Parser* p);
  static AST* type_expression(Parser* p);
- static AST* const_expression(Parser* p);
- static AST* definition(Parser* p);
+ static AST* struct_fields(Parser* p);
 -static AST* const_expression(Parser* p);
 -static AST* definition(Parser* p);
++static AST* expression_block(Parser* p);
++static AST* statement(Parser* p);
  static AST* expression(Parser* p);
++static AST* definition(Parser* p, bool constant);
++
++static AST* const_expression(Parser* p);
  static AST* identifier(Parser* p);
  static AST* function(Parser* p);
  static AST* literal(Parser* p);
@@@ -136,11 -136,11 +139,10 @@@ static AST* type_definition(Parser* p) 
  static AST* func_definition(Parser* p) {
      expect(p, T_FUN);
      expect(p, T_ID);
-     expect(p, T_LPAR);
-     expect(p, T_RPAR);
+     expect(p, '(');
+     expect(p, ')');
      type_expression(p);
-     expect(p, T_LBRACE);
-     expect(p, T_RBRACE);
 -    expect(p, '{');
 -    expect(p, '}');
++    expression_block(p);
      return NULL;
  }
  
@@@ -168,12 -178,23 +180,67 @@@ static AST* type_expression(Parser* p) 
      return NULL;
  }
  
 -    } while(!matches(p, '}'));
+ static AST* struct_fields(Parser* p) {
+     expect(p, '{');
+     do {
+         expect(p, T_ID);
+         expect(p, '=');
+         type_expression(p);
+         expect(p, ';');
++    } while (!matches(p, '}'));
+     expect(p, '}');
+     return NULL;
+ }
  
++static AST* expression_block(Parser* p) {
++    expect(p, '{');
++    while (!matches(p, '}')) {
++        statement(p);
++    }
++    expect(p, '}');
++    return NULL;
++}
  
++static AST* statement(Parser* p) {
++    if (matches(p, '{')) {
++        expression_block(p);
++    } else {
++        if (accept(p, T_RETURN)) {
++            expression(p);
++            expect(p, ';');
++        } else if (matches(p, T_LET) || matches(p, T_VAR)) {
++            definition(p, (peek(p)->type == T_LET));
++        } else {
++            expression(p);
++            expect(p, ';');
++        }
++    }
++    return NULL;
++}
  
++static AST* expression(Parser* p) {
++    AST* expr = NULL;
++    if (accept(p, '(')) {
++        expr = expression(p);
++        expect(p, ')');
++    } else if (matches(p, T_ID)) {
++        expr = identifier(p);
++    } else {
++        expr = literal(p);
++    }
++    return expr;
++}
  
--
--
++static AST* definition(Parser* p, bool constant) {
++    if (!accept(p, T_LET) && !accept(p, T_VAR))
++        error(p, "constant or variable definition expected");
++    expect(p, T_ID);
++    type_expression(p);
++    expect(p, '=');
++    const_expression(p);
++    expect(p, ';');
++    return NULL;
++}
  
  
  
diff --cc source/pprint.c
index ac01cea2ae4b96cccc85a1472be4854bd1a775a6,ee85b8a4c817374e2eb926ff7784cc6ab686c466..24aabe159979938972dbc89426e68291de5785b7
@@@ -5,7 -5,7 +5,7 @@@ static void print_indent(FILE* file, in
          fprintf(file, "%c", ' ');
  }
  
--static const char* token_type_to_string(TokType type) {
++static const char* token_type_to_string(int type) {
      switch(type) {
          case T_STRING:   return "T_STRING";
          case T_CHAR:     return "T_CHAR";
diff --cc source/sclpl.h
index 6d9c8f468ee6ff652d55af43df68a83532cb72c6,903c45aa7cac69390a3137fedc54e8def6aaf4b0..3337e8f5976d893ffbf6d6d11b6d628667da4af8
@@@ -40,12 -40,10 +40,10 @@@ void vec_set(vec_t* vec, size_t index, 
  /* Token Types
   *****************************************************************************/
  typedef enum {
-     T_NONE, T_ERROR, T_END_FILE,
+     T_NONE = 0, T_ERROR = 256, T_END_FILE,
      T_PACKAGE, T_REQUIRES, T_PROVIDES, T_LET, T_VAR, T_FUN, T_TYPE, T_STRUCT,
--    T_UNION,
++    T_UNION, T_RETURN,
      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
  } TokType;
  
  typedef struct {