From 51c5e13c57db1e412bfed1126475b5245ef6745a Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Sat, 16 Jun 2018 21:39:47 -0400 Subject: [PATCH] tweak top-level syntax --- example.src | 5 ++--- source/lexer.l | 5 ++--- source/parser.c | 23 +++++++---------------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/example.src b/example.src index ed810ac..1b023c8 100644 --- a/example.src +++ b/example.src @@ -1,6 +1,5 @@ -package main -requires ("fmt") -provides (main) +require ("fmt") +provide (main) let const_true bool = true; let const_false bool = false; diff --git a/source/lexer.l b/source/lexer.l index 9926b19..9916d4b 100644 --- a/source/lexer.l +++ b/source/lexer.l @@ -33,9 +33,8 @@ NOSPACE [^ \t\r\n] [ \t\r\n] { /* whitespace is insignificant */ } #.*[\r\n] { /* skip line comments */ } -"package" { return T_PACKAGE; } -"requires" { return T_REQUIRES; } -"provides" { return T_PROVIDES; } +"require" { return T_REQUIRES; } +"provide" { return T_PROVIDES; } "let" { return T_LET; } "var" { return T_VAR; } "fun" { return T_FUN; } diff --git a/source/parser.c b/source/parser.c index b15a47a..10952db 100644 --- a/source/parser.c +++ b/source/parser.c @@ -13,7 +13,6 @@ static AST* definition(Parser* p); static AST* expression(Parser* p); static AST* identifier(Parser* p); static AST* function(Parser* p); -static Type* type_annotation(Parser* p); static AST* literal(Parser* p); static AST* expr_block(Parser* p); static AST* if_stmnt(Parser* p); @@ -68,16 +67,13 @@ static Tok* expect_val(Parser* p, TokType type) { return tok; } - /* Grammar Definition *****************************************************************************/ AST* toplevel(Parser* p) { - expect(p, T_PACKAGE); - expect(p, T_ID); - if (accept(p, T_REQUIRES)) { + if (matches(p, T_REQUIRES)) { require_list(p); } - if (accept(p, T_PROVIDES)) { + if (matches(p, T_PROVIDES)) { provide_list(p); } definition_list(p); @@ -85,6 +81,7 @@ AST* toplevel(Parser* p) { } static void require_list(Parser* p) { + accept(p, T_REQUIRES); expect(p, T_LPAR); while (!matches(p, T_RPAR)) { expect(p, T_STRING); @@ -93,6 +90,7 @@ static void require_list(Parser* p) { } static void provide_list(Parser* p) { + accept(p, T_PROVIDES); expect(p, T_LPAR); while (!matches(p, T_RPAR)) { expect(p, T_ID); @@ -120,10 +118,10 @@ static AST* definition_list(Parser* p) { static AST* const_definition(Parser* p, bool constant) { if (!accept(p, T_LET) && !accept(p, T_VAR)) error(p, "constant or variable definition expected"); - Tok* id = expect_val(p, T_ID); - Type* type = type_annotation(p); + expect(p, T_ID); + type_expression(p); expect(p, T_ASSIGN); - AST* expr = const_expression(p); + const_expression(p); expect(p, T_SEMI); return NULL; } @@ -177,19 +175,12 @@ static AST* type_expression(Parser* p) { - - static Type* get_typedef(Parser* p, char* typename) { Sym* sym = sym_get(&(p->syms), typename); if (!sym) error(p, "unknown type '%s'", typename); return sym->type; } -static Type* type_annotation(Parser* p) { - Tok* id = expect_val(p, T_ID); - return get_typedef(p, id->value.text); -} - static AST* literal(Parser* p) { AST* ret = NULL; Tok* tok = peek(p); -- 2.52.0