From 273901c569c8d6f52ad0c667b6812eca690ecf98 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Fri, 15 Jun 2018 22:34:33 -0400 Subject: [PATCH] added semicolons and = to type and value definitions --- example.src | 18 +++++++++--------- source/lexer.l | 2 ++ source/parser.c | 9 +++++---- source/sclpl.h | 2 +- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/example.src b/example.src index 583ac3e..ed810ac 100644 --- a/example.src +++ b/example.src @@ -2,17 +2,17 @@ package main requires ("fmt") provides (main) -let const_true bool = true -let const_false bool = false -let const_uint int = 123 -let const_string string = "" +let const_true bool = true; +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 const_true bool = true; +var const_false bool = false; +var const_uint int = 123; +var const_string string = ""; -# type type_int int +type type_int = int; # type type_intary int[] # type type_intary42 int[42] # type type_intaryary int[][] diff --git a/source/lexer.l b/source/lexer.l index f7cb952..9926b19 100644 --- a/source/lexer.l +++ b/source/lexer.l @@ -39,6 +39,7 @@ NOSPACE [^ \t\r\n] "let" { return T_LET; } "var" { return T_VAR; } "fun" { return T_FUN; } +"type" { return T_TYPE; } "if" { return T_IF; } "else" { return T_ELSE; } @@ -53,6 +54,7 @@ NOSPACE [^ \t\r\n] ":" { return T_COLON; } "&" { return T_AMP; } "=" { return T_ASSIGN; } +";" { return T_SEMI; } \\. { Value.character = yytext[1]; return T_CHAR; } \\space { Value.character = ' '; return T_CHAR; } diff --git a/source/parser.c b/source/parser.c index 859412b..b15a47a 100644 --- a/source/parser.c +++ b/source/parser.c @@ -110,6 +110,7 @@ static AST* definition_list(Parser* p) { } else if (matches(p, T_FUN)) { func_definition(p); } else { + printf("%d\n", peek(p)->type); error(p, "only definitions are allowed at the toplevel"); } } @@ -123,16 +124,16 @@ static AST* const_definition(Parser* p, bool constant) { Type* type = type_annotation(p); expect(p, T_ASSIGN); AST* expr = const_expression(p); - sym_add(&(p->syms), (constant ? SF_CONSTANT : 0), id->value.text, type); - if (!types_equal(type, expr->datatype)) - error(p, "type mismatch"); - return Var(id, expr, constant); + expect(p, T_SEMI); + return NULL; } static AST* type_definition(Parser* p) { expect(p, T_TYPE); expect(p, T_ID); + expect(p, T_ASSIGN); type_expression(p); + expect(p, T_SEMI); return NULL; } diff --git a/source/sclpl.h b/source/sclpl.h index c8e8e5d..7c8d3a9 100644 --- a/source/sclpl.h +++ b/source/sclpl.h @@ -44,7 +44,7 @@ typedef enum { T_PACKAGE, T_REQUIRES, T_PROVIDES, T_LET, T_VAR, T_FUN, T_TYPE, 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_DQUOTE, T_COLON, T_AMP, T_IF, T_ELSE, T_ASSIGN, T_SEMI } TokType; typedef struct { -- 2.54.0