summaryrefslogtreecommitdiff
path: root/scope.c
blob: 722e43027bacf2d01dc684c4b5af21104ad391b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "scope.h"
#include "group.h"
#include "token.h"
#include <stdio.h>

void
scope_extract(Token *list)
{
	// Recurse in child scopes.
	for (Token *e = list->group.tokens; e != NULL; e = e->next)
		if (e->type == TOK_GROUP)
			scope_extract(e);
	if (!token_isgroup(list, GROUP_SCOPE))
		return;

	// Extract let groups.
	Token *e = list->group.tokens; 
	while (e != NULL)
		if (token_isgroup(e, GROUP_LET)) {
			token_append(&list->group.scope,
			             token_extract(&list->group.tokens, e));
			group_extract(&list->group.scope,
			              token_last(list->group.scope));
			e = list->group.tokens; // XXX: this is slow
		} else
			e = e->next;
}