Skip to content

Commit

Permalink
Group all parsers steps in ac parser
Browse files Browse the repository at this point in the history
  • Loading branch information
sgranjoux committed Nov 21, 2009
1 parent 686507b commit 8341892
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 16 deletions.
116 changes: 106 additions & 10 deletions libanjuta/anjuta-token.c
Original file line number Diff line number Diff line change
Expand Up @@ -462,11 +462,14 @@ anjuta_token_parent (AnjutaToken *token)
AnjutaToken *
anjuta_token_unlink (AnjutaToken *token)
{
/* Convert children to sibling */
anjuta_token_group_children (token);

if (token->prev != NULL)
{
token->prev->next = token->next;
}
else if (token->parent)
else if ((token->parent != NULL) && (token->parent->children == token))
{
token->parent->children = token->next;
}
Expand Down Expand Up @@ -729,9 +732,11 @@ anjuta_token_merge_children (AnjutaToken *first, AnjutaToken *end)
{
anjuta_token_insert_before (end, first);
}
anjuta_token_unlink (end);
if (end->last != NULL)
{
first->last = end->last;
end->last->group = first;
}
end->group = first;
anjuta_token_free (end);
Expand Down Expand Up @@ -860,7 +865,7 @@ AnjutaToken *
anjuta_token_insert_after (AnjutaToken *sibling, AnjutaToken *token)
{
token->parent = sibling->parent;

if (sibling->next)
{
sibling->next->prev = token;
Expand Down Expand Up @@ -1056,8 +1061,13 @@ AnjutaToken *anjuta_token_get_next_arg (AnjutaToken *arg, gchar ** value)
static void
anjuta_token_show (AnjutaToken *token, gint indent)
{
fprintf (stderr, "%*s%p", indent, "", token);
fprintf (stderr, ": %d \"%.*s\" %p %s\n", anjuta_token_get_type (token), anjuta_token_get_length (token), anjuta_token_get_string (token), token->last, anjuta_token_get_flags (token) & ANJUTA_TOKEN_REMOVED ? " (removed)" : "");
fprintf (stdout, "%*s%p", indent, "", token);
fprintf (stdout, ": %d \"%.*s\" %p/%p %s\n",
anjuta_token_get_type (token),
anjuta_token_get_length (token),
anjuta_token_get_string (token),
token->last, token->children,
anjuta_token_get_flags (token) & ANJUTA_TOKEN_REMOVED ? " (removed)" : "");
}

static AnjutaToken*
Expand All @@ -1069,10 +1079,33 @@ anjuta_token_dump_child (AnjutaToken *token, gint indent)
if (token->children != NULL)
{
AnjutaToken *child;
AnjutaToken *next = NULL;
AnjutaToken *last = anjuta_token_next_after_children (token);

for (child = token->children; child != NULL; child = child->next)
for (child = token->children; child != NULL;)
{
anjuta_token_dump_child (child, indent + 4);
if (child == last)
{
return child;
}
if (next == NULL)
{
next = anjuta_token_dump_child (child, indent + 4);
}
if (child == next)
{
next = NULL;

#if 0
/* Look for previous children */
for (child = anjuta_token_next (child); child != NULL; child = child->parent)
{
if (child->parent == token) break;
};
continue;
#endif
}
child = anjuta_token_next (child);
}
}

Expand All @@ -1086,10 +1119,16 @@ anjuta_token_dump_child (AnjutaToken *token, gint indent)
if (next == NULL)
{
next = anjuta_token_dump_child (child, indent + 4);
if (child == token->last) return next;
if (child == token->last)
{
return child;
}
}
if (child == next) next = NULL;
if (child == token->last) return child;
if (child == token->last)
{
return child;
}
}
}

Expand Down Expand Up @@ -1167,6 +1206,41 @@ anjuta_token_check (AnjutaToken *token)
return TRUE;
}

AnjutaToken *anjuta_token_group_children (AnjutaToken *token)
{
g_return_val_if_fail (token != NULL, NULL);

if (token->children)
{
AnjutaToken *child;
AnjutaToken *next = token;
AnjutaToken *last = NULL;
gboolean group = token->last == NULL;

for (child = token->children; child != NULL; child = token->children)
{
next = anjuta_token_insert_after (next, anjuta_token_unlink (child));

if (last == NULL)
{
if (child->last != NULL)
{
last = child->last;
}
child->group = token;
if (group) token->last = child;
}
else if (last == child)
{
last = child->last;
}
}
token->children = NULL;
}

return token;
}

/* Constructor & Destructor
*---------------------------------------------------------------------------*/

Expand Down Expand Up @@ -1234,17 +1308,39 @@ AnjutaToken *anjuta_token_new_static (AnjutaTokenType type, const char *value)
}

AnjutaToken*
anjuta_token_free (AnjutaToken *token)
anjuta_token_free_children (AnjutaToken *token)
{
AnjutaToken *child;
AnjutaToken *next;

if (token == NULL) return NULL;

for (child = token->children; child != NULL; child = token->children)
{
anjuta_token_free (child);
}
token->children = NULL;

if (token->last != NULL)
{
for (child = anjuta_token_next (token); child != NULL; child = anjuta_token_next (token))
{
anjuta_token_free (child);
if (child == token->last) break;
}
}
token->last = NULL;

return token;
}

AnjutaToken*
anjuta_token_free (AnjutaToken *token)
{
AnjutaToken *next;

if (token == NULL) return NULL;

anjuta_token_free_children (token);

next = anjuta_token_next (token);
anjuta_token_unlink (token);
Expand Down
2 changes: 2 additions & 0 deletions libanjuta/anjuta-token.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,12 @@ AnjutaToken *anjuta_token_new_with_string (AnjutaTokenType type, gchar *value, g
AnjutaToken *anjuta_token_new_static (AnjutaTokenType type, const gchar *value);
AnjutaToken *anjuta_token_new_fragment (gint type, const gchar *pos, gsize length);

AnjutaToken* anjuta_token_free_children (AnjutaToken *token);
AnjutaToken* anjuta_token_free (AnjutaToken *token);

AnjutaToken *anjuta_token_unlink (AnjutaToken *token);

AnjutaToken *anjuta_token_group_children (AnjutaToken *token);
AnjutaToken *anjuta_token_merge (AnjutaToken *first, AnjutaToken *end);
AnjutaToken *anjuta_token_merge_own_children (AnjutaToken *first);
AnjutaToken *anjuta_token_merge_children (AnjutaToken *first, AnjutaToken *end);
Expand Down
29 changes: 23 additions & 6 deletions src/am-project.c
Original file line number Diff line number Diff line change
Expand Up @@ -1026,15 +1026,28 @@ amp_project_load_module (AmpProject *project, AnjutaToken *module)
/* Package list */
arg = anjuta_token_next_item (arg);
scanner = amp_ac_scanner_new (project);
fprintf (stdout, "\nParse list\n");
list = amp_ac_scanner_parse_token (scanner, arg, AC_SPACE_LIST_STATE, NULL);
anjuta_token_dump (list);

//fprintf(stdout, "Parse list\n");
//anjuta_token_dump (list);
//fprintf(stdout, "Parse argument\n");
//anjuta_token_dump (arg);
anjuta_token_free_children (arg);
//fprintf(stdout, "Free child argument\n");
//anjuta_token_dump (arg);
list = anjuta_token_insert_after (arg, list);
//fprintf(stdout, "Insert list parent\n");
//anjuta_token_dump (anjuta_token_parent (arg));
anjuta_token_group_children (list);
//fprintf(stdout, "Group children\n");
//anjuta_token_dump (list);
anjuta_token_merge_children (arg, list);
//fprintf(stdout, "Merge list parent\n");
//anjuta_token_dump (anjuta_token_parent (arg));
amp_ac_scanner_free (scanner);

pack = NULL;
compare = NULL;
for (item = anjuta_token_first_item (list); item != NULL; item = anjuta_token_next_item (item))
for (item = anjuta_token_first_item (arg); item != NULL; item = anjuta_token_next_item (item))
{
value = anjuta_token_evaluate (item);
if (value == NULL) continue; /* Empty value, a comment of a quote by example */
Expand Down Expand Up @@ -1091,9 +1104,13 @@ amp_project_load_config (AmpProject *project, AnjutaToken *arg_list)

arg = anjuta_token_first_group (arg_list);
list = amp_ac_scanner_parse_token (scanner, arg, AC_SPACE_LIST_STATE, NULL);
anjuta_token_free_children (arg);
list = anjuta_token_insert_after (arg, list);
anjuta_token_group_children (list);
anjuta_token_merge_children (arg, list);
amp_ac_scanner_free (scanner);

for (item = anjuta_token_first_item (list); item != NULL; item = anjuta_token_next_item (item))
for (item = anjuta_token_first_item (arg); item != NULL; item = anjuta_token_next_item (item))
{
gchar *value;
AmpConfigFile *cfg;
Expand Down Expand Up @@ -1518,7 +1535,7 @@ amp_project_reload (AmpProject *project, GError **error)
project->configure_token = amp_ac_scanner_parse_token (scanner, arg, 0, &err);
fprintf (stdout, "AC file after parsing\n");
anjuta_token_check (arg);
anjuta_token_dump (arg);
anjuta_token_dump (project->configure_token);
fprintf (stdout, "\n");
amp_ac_scanner_free (scanner);
if (project->configure_token == NULL)
Expand Down

0 comments on commit 8341892

Please sign in to comment.