diff --git a/src/lexer/SolsToken.h b/src/lexer/SolsToken.h index c3cc979..c883ba5 100644 --- a/src/lexer/SolsToken.h +++ b/src/lexer/SolsToken.h @@ -10,7 +10,7 @@ #include "SolsLiteral.h" typedef enum SolsTokenType { - STT_IDENTIFIER, STT_LITERAL, STT_TYPE, STT_DOT, STT_OPEN_CURLY, STT_CLOSE_CURLY, STT_OPEN_PAREN, STT_CLOSE_PAREN, STT_OP_ADD, STT_OP_SUB, STT_OP_MUL, STT_OP_DIV, STT_OP_ADDTO, STT_OP_SUBTO, STT_OP_MULTO, STT_OP_DIVTO, STT_OP_INCREMENT, STT_OP_DECREMENT, STT_OP_SET, STT_OP_GREATER, STT_OP_LESSER, STT_OP_EQUAL, STT_OP_INEQUAL, STT_OP_EQGREATER, STT_OP_EQLESSER, STT_KW_DEF, STT_KW_LAMBDA, STT_KW_STRUCT, STT_KW_PUTS, STT_KW_IF, STT_KW_WHILE, STT_KW_NEW, STT_KW_GROUND, STT_LINE_END + STT_IDENTIFIER, STT_LITERAL, STT_TYPE, STT_DOT, STT_OPEN_CURLY, STT_CLOSE_CURLY, STT_OPEN_PAREN, STT_CLOSE_PAREN, STT_OP_ADD, STT_OP_SUB, STT_OP_MUL, STT_OP_DIV, STT_OP_ADDTO, STT_OP_SUBTO, STT_OP_MULTO, STT_OP_DIVTO, STT_OP_INCREMENT, STT_OP_DECREMENT, STT_OP_SET, STT_OP_GREATER, STT_OP_LESSER, STT_OP_EQUAL, STT_OP_INEQUAL, STT_OP_EQGREATER, STT_OP_EQLESSER, STT_KW_DEF, STT_KW_LAMBDA, STT_KW_STRUCT, STT_KW_PUTS, STT_KW_IF, STT_KW_WHILE, STT_KW_NEW, STT_KW_GROUND, STT_LINE_END, STT_COMMA } SolsTokenType; typedef char* charptr; diff --git a/src/lexer/lexer.c b/src/lexer/lexer.c index 3611db0..da5b8b9 100644 --- a/src/lexer/lexer.c +++ b/src/lexer/lexer.c @@ -36,6 +36,7 @@ struct _SolsTokenTypeMap SolsTokenTypeMap[] = { {"<=", STT_OP_EQLESSER}, {"\n", STT_LINE_END}, {";", STT_LINE_END}, + {",", STT_COMMA}, // Shh, this is our little secret // Your reward for actually reading the source code // Enable this by adding -DSUPER_SILLY_MODE to your diff --git a/src/parser/parser.c b/src/parser/parser.c index 7441259..175e3f1 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -1165,7 +1165,7 @@ static inline ResultType(Nothing, charptr) parseLambda(SolsParser* parser) { return Error(Nothing, charptr, type.as.error); } - // Pattern of type, name + // Pattern of type, name, comma SolsType tmpType; @@ -1191,6 +1191,19 @@ static inline ResultType(Nothing, charptr) parseLambda(SolsParser* parser) { // Add type to constructed SolsType addChildToSolsType(&type.as.success, tmpType, argName); parserConsume(parser); + + next = parserPeek(parser, 1); + if (next.error) { + return Error(Nothing, charptr, "Expecting a comma or closing bracket"); + } + if (next.as.success.type == STT_CLOSE_PAREN) { + parserConsume(parser); + break; + } + if (next.as.success.type != STT_COMMA) { + return Error(Nothing, charptr, "Expecting a comma or closing bracket"); + } + parserConsume(parser); } // Parse type at the end