diff --git a/src/main.c b/src/main.c index 6492f17..c388cf1 100644 --- a/src/main.c +++ b/src/main.c @@ -33,7 +33,7 @@ void print_node(noomP_Node* node, noom_uint_t depth) { int main(int argc, char** argv) { // uhh uhhh uhhhhh - const char* code = "local function a(a, ...) local a = 2 end"; + const char* code = "local a = function(a,b,c,...) print('hi'); end"; noom_uint_t pos = 0; printf("LEX OUTPUT:\n"); diff --git a/src/parser.c b/src/parser.c index a35a9e3..149a908 100644 --- a/src/parser.c +++ b/src/parser.c @@ -41,6 +41,8 @@ const char *noomP_formatNodeType(noomP_NodeType node_type) { return "call"; case NOOMP_NODE_METHODCALL: return "method call"; + case NOOMP_NODE_LAMBDAFUNCTIONLITERAL: + return "lambda function literal"; case NOOMP_NODE_FUNCTIONDECLARATION: return "function declaration"; case NOOMP_NODE_LOCALFUNCTIONDECLARATION: @@ -344,6 +346,30 @@ noomP_Node* noomP_parseRawExpression(noomP_Parser* parser) { litNode->source_offset = token.offset; return litNode; + } else if (noom_streql(parser->code + token.offset, token.length, "function", 8)) { + noomP_skip(parser, &token); + + noomP_Node* funcNode = noomP_allocNode(parser); + if (funcNode == 0) return 0; + + funcNode->type = NOOMP_NODE_LAMBDAFUNCTIONLITERAL; + funcNode->source_offset = token.offset; + + noomP_Node* params = noomP_parseFunctionParameters(parser); + if (params == 0) return 0; + noomP_addSubnode(funcNode, params); + + noomP_Node* block = noomP_parseBlock(parser); + if (block == 0) return 0; + noomP_addSubnode(funcNode, block); + + noomP_peek(parser, &token); + if (token.type != NOOML_TOKEN_KEYWORD || !noom_streql(parser->code + token.offset, token.length, "end", 3)) { + return 0; + } + noomP_skip(parser, &token); + + return funcNode; } } else if (token.type == NOOML_TOKEN_SYMBOL) { if (noom_streql(parser->code + token.offset, token.length, "(", 1)) { // parenthesized diff --git a/src/parser.h b/src/parser.h index b3a524f..4861aa0 100644 --- a/src/parser.h +++ b/src/parser.h @@ -29,6 +29,7 @@ typedef enum noomP_NodeType { NOOMP_NODE_CALL, NOOMP_NODE_METHODCALL, + NOOMP_NODE_LAMBDAFUNCTIONLITERAL, NOOMP_NODE_FUNCTIONDECLARATION, NOOMP_NODE_LOCALFUNCTIONDECLARATION, NOOMP_NODE_FUNCTIONPARAMETERS, @@ -76,8 +77,11 @@ void noomP_skip(noomP_Parser* parser, noomL_Token* token); noomP_Node* noomP_allocNode(noomP_Parser* parser); -noomP_Node* noomP_parseStatement(noomP_Parser* parser); +noomP_Node* noomP_parseFunctionParameters(noomP_Parser* parser); +noomP_Node* noomP_parseBlock(noomP_Parser* parser); + noomP_Node* noomP_parseExpression(noomP_Parser* parser); +noomP_Node* noomP_parseStatement(noomP_Parser* parser); int noomP_parse(const char* code, const char* filename, noom_LuaVersion version, noomP_Node** outpointer, noomP_Node** last_node);