forked from NeoFlock/noom
parser: lambda function literals
This commit is contained in:
@@ -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");
|
||||
|
||||
26
src/parser.c
26
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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user