summaryrefslogtreecommitdiff
path: root/tools/d2c/args
diff options
context:
space:
mode:
Diffstat (limited to 'tools/d2c/args')
-rw-r--r--tools/d2c/args/Makefile.am3
-rw-r--r--tools/d2c/args/grammar.y3
-rw-r--r--tools/d2c/args/manager.c202
-rw-r--r--tools/d2c/args/manager.h21
-rw-r--r--tools/d2c/args/tokens.l9
5 files changed, 132 insertions, 106 deletions
diff --git a/tools/d2c/args/Makefile.am b/tools/d2c/args/Makefile.am
index 1a2647c..3c4ef38 100644
--- a/tools/d2c/args/Makefile.am
+++ b/tools/d2c/args/Makefile.am
@@ -26,6 +26,9 @@ libd2cargs_la_SOURCES = \
tokens.l \
grammar.y
+# _GNU_SOURCE : asprintf
+libd2cargs_la_CFLAGS = -D_GNU_SOURCE
+
# Automake fait les choses à moitié
CLEANFILES = grammar.h grammar.c grammar.output tokens.c tokens.h
diff --git a/tools/d2c/args/grammar.y b/tools/d2c/args/grammar.y
index 41512a9..b038e22 100644
--- a/tools/d2c/args/grammar.y
+++ b/tools/d2c/args/grammar.y
@@ -78,7 +78,8 @@ right_op : FORCE_EXPR arg_expr { operand->func = NULL; operand->expr = $2; }
call : NAME OP arg_list CP { $$.func = $1; $$.args = $3; }
-arg_list : arg_expr { $$ = build_arg_list($1); }
+arg_list : /* empty */ { $$ = build_empty_arg_list(); }
+ | arg_expr { $$ = build_arg_list($1); }
| arg_list COMMA arg_expr { $$ = extend_arg_list($1, $3); }
arg_expr : NAME { $$ = build_arg_expr_from_name($1); }
diff --git a/tools/d2c/args/manager.c b/tools/d2c/args/manager.c
index 3cd215d..8e1ef4d 100644
--- a/tools/d2c/args/manager.c
+++ b/tools/d2c/args/manager.c
@@ -132,10 +132,10 @@ struct _arg_expr_t
/* Visite une expression en traitant en premier ses composantes. */
-typedef bool (* visit_expr_fc) (arg_expr_t *, int, const coding_bits *, const conv_list *, void *);
+typedef bool (* visit_expr_fc) (arg_expr_t *);
/* Visite une expression en traitant en premier ses composantes. */
-static bool visit_arg_expr(arg_expr_t *, visit_expr_fc, int, const coding_bits *, const conv_list *, void *);
+static bool visit_arg_expr(arg_expr_t *, visit_expr_fc);
/* Retrouve si elle existe une variable manipulée. */
static bool find_var_by_name(const coding_bits *, const conv_list *, const char *, raw_bitfield **, conv_func **);
@@ -641,11 +641,8 @@ bool compute_arg_expr_size(const arg_expr_t *expr, const coding_bits *bits, cons
/******************************************************************************
* *
-* Paramètres : expr = première expression à encapsuler. *
-* fd = descripteur d'un flux ouvert en écriture. *
-* bits = gestionnaire des bits d'encodage. *
-* list = liste de l'ensemble des fonctions de conversion. *
-* data = éventuelle donnée à transmettre à chaque visite. *
+* Paramètres : expr = première expression encapsulée. *
+* visit = fonction à appeler pour chaque élément recontré. *
* *
* Description : Visite une expression en traitant en premier ses composantes.*
* *
@@ -655,29 +652,32 @@ bool compute_arg_expr_size(const arg_expr_t *expr, const coding_bits *bits, cons
* *
******************************************************************************/
-static bool visit_arg_expr(arg_expr_t *expr, visit_expr_fc visit, int fd, const coding_bits *bits, const conv_list *list, void *data)
+static bool visit_arg_expr(arg_expr_t *expr, visit_expr_fc visit)
{
bool result; /* Bilan à retourner */
switch (expr->type)
{
case CET_LOGICAL:
- result = visit_arg_expr(expr->logical_expr1, visit, fd, bits, list, data);
- result = visit_arg_expr(expr->logical_expr2, visit, fd, bits, list, data);
+ result = visit_arg_expr(expr->logical_expr1, visit);
+ if (result)
+ result = visit_arg_expr(expr->logical_expr2, visit);
break;
case CET_UNARY:
- result = visit_arg_expr(expr->un_expr, visit, fd, bits, list, data);
+ result = visit_arg_expr(expr->un_expr, visit);
break;
case CET_CONDITIONAL:
- result = visit_arg_expr(expr->cond_expr1, visit, fd, bits, list, data);
- result = visit_arg_expr(expr->cond_expr2, visit, fd, bits, list, data);
+ result = visit_arg_expr(expr->cond_expr1, visit);
+ if (result)
+ result = visit_arg_expr(expr->cond_expr2, visit);
break;
case CET_BINARY:
- result = visit_arg_expr(expr->bin_expr1, visit, fd, bits, list, data);
- result = visit_arg_expr(expr->bin_expr2, visit, fd, bits, list, data);
+ result = visit_arg_expr(expr->bin_expr1, visit);
+ if (result)
+ result = visit_arg_expr(expr->bin_expr2, visit);
break;
default:
@@ -686,7 +686,8 @@ static bool visit_arg_expr(arg_expr_t *expr, visit_expr_fc visit, int fd, const
}
- result &= visit(expr, fd, bits, list, data);
+ if (result)
+ result = visit(expr);
return result;
@@ -729,9 +730,6 @@ static bool find_var_by_name(const coding_bits *bits, const conv_list *list, con
if (field != NULL) *field = cached_field;
if (func != NULL) *func = cached_func;
- if (!result)
- fprintf(stderr, "Variable '%s' not found!\n", name);
-
return result;
}
@@ -753,31 +751,27 @@ static bool find_var_by_name(const coding_bits *bits, const conv_list *list, con
bool ensure_arg_expr_content_fully_marked(arg_expr_t *expr, const coding_bits *bits, const conv_list *list)
{
- bool mark_sub_expr(arg_expr_t *sub, int dummy, const coding_bits *bts, const conv_list *lst, void *unused)
+ bool mark_sub_expr(arg_expr_t *sub)
{
bool result; /* Bilan à retourner */
size_t i; /* Boucle de parcours */
- bool mark_by_name(const coding_bits *_bts, const conv_list *_lst, const char *name)
+ bool mark_by_name(const char *name)
{
bool found; /* Bilan d'opération à renvoyer*/
raw_bitfield *field; /* Eventuel champ brut associé */
conv_func *func; /* Eventuelle fonction liée */
- found = find_var_by_name(bts, lst, name, &field, &func);
+ found = find_var_by_name(bits, list, name, &field, &func);
if (found)
{
if (field != NULL)
mark_raw_bitfield_as_used(field);
else /*if (func != NULL) */
- mark_conv_func(func, true, bts, lst);
-
- printf(" VAR '%s' found (bf=%d fc=%d)\n", name, !!field, !!func);
-
+ mark_conv_func(func, true, bits, list);
}
- else printf(" VAR '%s' not found...\n", name);
return found;
@@ -787,7 +781,7 @@ bool ensure_arg_expr_content_fully_marked(arg_expr_t *expr, const coding_bits *b
switch (sub->type)
{
case CET_NAME:
- /* result = */mark_by_name(bits, lst, sub->name);
+ /* result = */mark_by_name(sub->name);
result = true;
break;
@@ -795,7 +789,7 @@ bool ensure_arg_expr_content_fully_marked(arg_expr_t *expr, const coding_bits *b
result = true;
for (i = 0; i < sub->comp_count && result; i++)
if (!isdigit(sub->comp_items[i][0]))
- result = mark_by_name(bits, lst, sub->comp_items[i]);
+ result = mark_by_name(sub->comp_items[i]);
break;
default:
@@ -808,7 +802,7 @@ bool ensure_arg_expr_content_fully_marked(arg_expr_t *expr, const coding_bits *b
}
- return visit_arg_expr(expr, (visit_expr_fc)mark_sub_expr, -1, bits, list, NULL);
+ return visit_arg_expr(expr, (visit_expr_fc)mark_sub_expr);
}
@@ -820,8 +814,7 @@ bool ensure_arg_expr_content_fully_marked(arg_expr_t *expr, const coding_bits *b
* arch = architecture visée par l'opération globale. *
* bits = gestionnaire des bits d'encodage. *
* list = liste de l'ensemble des fonctions de conversion. *
-* pp = pré-processeur pour les échanges de chaînes. *
-* wide = taille des mots décodés. *
+* tab = décalage éventuel selon l'inclusion. *
* *
* Description : S'assure de la déclaration des expressions pre-requises. *
* *
@@ -831,15 +824,17 @@ bool ensure_arg_expr_content_fully_marked(arg_expr_t *expr, const coding_bits *b
* *
******************************************************************************/
-bool ensure_arg_expr_content_fully_declared(arg_expr_t *expr, int fd, const coding_bits *bits, const conv_list *list, const pre_processor *pp, unsigned int wide)
+bool ensure_arg_expr_content_fully_declared(arg_expr_t *expr, int fd, const coding_bits *bits, const conv_list *list, const char *tab)
{
- bool declare_sub_expr(arg_expr_t *sub, int f, const coding_bits *bts, const conv_list *lst, unsigned int *wideptr)
+ bool declare_sub_expr(arg_expr_t *sub)
{
bool result; /* Bilan à retourner */
size_t i; /* Boucle de parcours */
- /* Si l'expression a déjà été définie lors d'un précédent besoin... */
- printf(" sub declared ? %d -- type = %d\n", sub->declared, sub->type);
+ /**
+ * Si l'expression a déjà été définie lors d'un précédent besoin...
+ */
+
if (sub->declared) return true;
bool declare_by_name(const char *name)
@@ -847,30 +842,10 @@ bool ensure_arg_expr_content_fully_declared(arg_expr_t *expr, int fd, const codi
bool found; /* Bilan d'opération à renvoyer*/
conv_func *func; /* Eventuelle fonction liée */
- found = find_var_by_name(bts, lst, name, NULL, &func);
+ found = find_var_by_name(bits, list, name, NULL, &func);
if (found && func != NULL)
- {
- printf("========= DECLARE for '%s'\n", name);
- found = declare_conv_func(func, fd, bits, list, pp, wide);
- printf("========= END DECLARE for '%s'\n", name);
-
- /**
- * Si on déclare les variables suivantes dans declare_conv_func(),
- * elles seront également déclarées pour les fonctions de conversion
- * racine à partir de declare_syntax_items(), ce qui ne convient pas
- * car les appels racine servent directement d'arguments.
- */
-
- /*
- if (is_conv_func_expression(func))
- dprintf(_f, "\t\tuint%u_t val_%s; // Ho\n", _wide, name); // FIXME
- else
- dprintf(_f, "\t\tGArchOperand *val_%s;;;;;\n", name); // FIXME
- */
-
-
- }
+ found = declare_conv_func(func, fd, bits, list, tab);
return found;
@@ -903,7 +878,7 @@ bool ensure_arg_expr_content_fully_declared(arg_expr_t *expr, int fd, const codi
}
- return visit_arg_expr(expr, (visit_expr_fc)declare_sub_expr, fd, bits, list, &wide);
+ return visit_arg_expr(expr, (visit_expr_fc)declare_sub_expr);
}
@@ -912,10 +887,9 @@ bool ensure_arg_expr_content_fully_declared(arg_expr_t *expr, int fd, const codi
* *
* Paramètres : expr = première expression à encapsuler. *
* fd = descripteur d'un flux ouvert en écriture. *
-* arch = architecture visée par l'opération globale. *
* bits = gestionnaire des bits d'encodage. *
* list = liste de l'ensemble des fonctions de conversion. *
-* pp = pré-processeur pour les échanges de chaînes. *
+* tab = décalage éventuel selon l'inclusion. *
* exit = exprime le besoin d'une voie de sortie. [OUT] *
* *
* Description : S'assure de la définition des expressions pre-requises. *
@@ -926,18 +900,9 @@ bool ensure_arg_expr_content_fully_declared(arg_expr_t *expr, int fd, const codi
* *
******************************************************************************/
-bool ensure_arg_expr_content_fully_defined(arg_expr_t *expr, int fd, const char *arch, const coding_bits *bits, const conv_list *list, const pre_processor *pp, bool *exit)
+bool ensure_arg_expr_content_fully_defined(arg_expr_t *expr, int fd, const coding_bits *bits, const conv_list *list, const char *tab, bool *exit)
{
- typedef struct _def_info
- {
- const char *arch;
- const pre_processor *pp;
-
- } def_info;
-
- def_info info; /* Transmissions au visiteur */
-
- bool define_sub_expr(arg_expr_t *sub, int f, const coding_bits *bts, const conv_list *lst, def_info *info)
+ bool define_sub_expr(arg_expr_t *sub)
{
bool result; /* Bilan à retourner */
size_t i; /* Boucle de parcours */
@@ -945,15 +910,15 @@ bool ensure_arg_expr_content_fully_defined(arg_expr_t *expr, int fd, const char
/* Si l'expression a déjà été définie lors d'un précédent besoin... */
if (sub->defined) return true;
- bool define_by_name(int _f, const coding_bits *_bts, const conv_list *_lst, def_info *_info, const char *name)
+ bool define_by_name(const char *name)
{
bool found; /* Bilan d'opération à renvoyer*/
conv_func *func; /* Eventuelle fonction liée */
- found = find_var_by_name(bts, lst, name, NULL, &func);
+ found = find_var_by_name(bits, list, name, NULL, &func);
if (found && func != NULL)
- found = define_conv_func(func, false, false, _f, _info->arch, _bts, _lst, _info->pp, exit);
+ found = define_conv_func(func, fd, bits, list, tab, false, exit);
return found;
@@ -963,7 +928,7 @@ bool ensure_arg_expr_content_fully_defined(arg_expr_t *expr, int fd, const char
switch (sub->type)
{
case CET_NAME:
- /* result = */define_by_name(f, bits, lst, info, sub->name);
+ /* result = */define_by_name(sub->name);
result = true;
break;
@@ -971,7 +936,7 @@ bool ensure_arg_expr_content_fully_defined(arg_expr_t *expr, int fd, const char
result = true;
for (i = 0; i < sub->comp_count && result; i++)
if (!isdigit(sub->comp_items[i][0]))
- result = define_by_name(f, bits, lst, info, sub->comp_items[i]);
+ result = define_by_name(sub->comp_items[i]);
break;
default:
@@ -986,10 +951,7 @@ bool ensure_arg_expr_content_fully_defined(arg_expr_t *expr, int fd, const char
}
- info.arch = arch;
- info.pp = pp;
-
- return visit_arg_expr(expr, (visit_expr_fc)define_sub_expr, fd, bits, list, &info);
+ return visit_arg_expr(expr, (visit_expr_fc)define_sub_expr);
}
@@ -1031,9 +993,9 @@ bool define_arg_expr(const arg_expr_t *expr, int fd, const coding_bits *bits, co
else
{
if (field != NULL)
- dprintf(fd, "raw_%s", expr->name);
+ write_raw_bitfield(field, fd);
else
- dprintf(fd, "val_%s", expr->name);
+ write_conv_func(func, fd, true);
}
break;
@@ -1103,17 +1065,15 @@ bool define_arg_expr(const arg_expr_t *expr, int fd, const coding_bits *bits, co
if (field != NULL)
{
- if (max_size == 0)
- dprintf(fd, "raw_%s", cname);
- else
- dprintf(fd, "raw_%s << %u", cname, max_size);
+ write_raw_bitfield(field, fd);
+ if (max_size > 0)
+ dprintf(fd, " << %u", max_size);
}
else
{
- if (max_size == 0)
- dprintf(fd, "val_%s", cname);
- else
- dprintf(fd, "val_%s << %u", cname, max_size);
+ write_conv_func(func, fd, true);
+ if (max_size > 0)
+ dprintf(fd, " << %u", max_size);
}
}
@@ -1204,6 +1164,32 @@ bool define_arg_expr(const arg_expr_t *expr, int fd, const coding_bits *bits, co
/******************************************************************************
* *
+* Paramètres : - *
+* *
+* Description : Crée une liste vide d'arguments de conversion. *
+* *
+* Retour : Nouvelle structure mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+arg_list_t *build_empty_arg_list(void)
+{
+ arg_list_t *result; /* Structure à retourner */
+
+ result = (arg_list_t *)calloc(1, sizeof(arg_list_t));
+
+ result->items = NULL;
+ result->count = 0;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : expr = expression initial pour constituer une liste. *
* *
* Description : Crée une liste d'arguments de conversion. *
@@ -1283,6 +1269,26 @@ arg_list_t *extend_arg_list(arg_list_t *list, arg_expr_t *expr)
/******************************************************************************
* *
+* Paramètres : args = liste d'expressions à traiter. *
+* *
+* Description : Indique le nombre d'arguments présents dans la liste. *
+* *
+* Retour : Nombre positif ou nul. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+#ifndef NDEBUG
+size_t get_arg_list_size(const arg_list_t *args)
+{
+ return args->count;
+
+}
+#endif
+
+
+/******************************************************************************
+* *
* Paramètres : args = liste d'expressions à supprimer de la mémoire. *
* bits = gestionnaire des bits d'encodage. *
* list = liste de l'ensemble des fonctions de conversion. *
@@ -1316,8 +1322,7 @@ bool ensure_arg_list_content_fully_marked(arg_list_t *args, const coding_bits *b
* fd = descripteur d'un flux ouvert en écriture. *
* bits = gestionnaire des bits d'encodage. *
* list = liste de l'ensemble des fonctions de conversion. *
-* pp = pré-processeur pour les échanges de chaînes. *
-* wide = taille des mots décodés. *
+* tab = décalage éventuel selon l'inclusion. *
* *
* Description : S'assure de la déclaration des expressions pre-requises. *
* *
@@ -1327,7 +1332,7 @@ bool ensure_arg_list_content_fully_marked(arg_list_t *args, const coding_bits *b
* *
******************************************************************************/
-bool ensure_arg_list_content_fully_declared(arg_list_t *args, int fd, const coding_bits *bits, const conv_list *list, const pre_processor *pp, unsigned int wide)
+bool ensure_arg_list_content_fully_declared(arg_list_t *args, int fd, const coding_bits *bits, const conv_list *list, const char *tab)
{
bool result; /* Bilan à remonter */
size_t i; /* Boucle de parcours */
@@ -1335,7 +1340,7 @@ bool ensure_arg_list_content_fully_declared(arg_list_t *args, int fd, const codi
result = true;
for (i = 0; i < args->count && result; i++)
- result = ensure_arg_expr_content_fully_declared(args->items[i], fd, bits, list, pp, wide);
+ result = ensure_arg_expr_content_fully_declared(args->items[i], fd, bits, list, tab);
return result;
@@ -1346,10 +1351,9 @@ bool ensure_arg_list_content_fully_declared(arg_list_t *args, int fd, const codi
* *
* Paramètres : args = liste d'expressions à supprimer de la mémoire. *
* fd = descripteur d'un flux ouvert en écriture. *
-* arch = architecture visée par l'opération globale. *
* bits = gestionnaire des bits d'encodage. *
* list = liste de l'ensemble des fonctions de conversion. *
-* pp = pré-processeur pour les échanges de chaînes. *
+* tab = décalage éventuel selon l'inclusion. *
* exit = exprime le besoin d'une voie de sortie. [OUT] *
* *
* Description : S'assure de la définition des expressions pre-requises. *
@@ -1360,7 +1364,7 @@ bool ensure_arg_list_content_fully_declared(arg_list_t *args, int fd, const codi
* *
******************************************************************************/
-bool ensure_arg_list_content_fully_defined(arg_list_t *args, int fd, const char *arch, const coding_bits *bits, const conv_list *list, const pre_processor *pp, bool *exit)
+bool ensure_arg_list_content_fully_defined(arg_list_t *args, int fd, const coding_bits *bits, const conv_list *list, const char *tab, bool *exit)
{
bool result; /* Bilan à remonter */
size_t i; /* Boucle de parcours */
@@ -1368,7 +1372,7 @@ bool ensure_arg_list_content_fully_defined(arg_list_t *args, int fd, const char
result = true;
for (i = 0; i < args->count && result; i++)
- result = ensure_arg_expr_content_fully_defined(args->items[i], fd, arch, bits, list, pp, exit);
+ result = ensure_arg_expr_content_fully_defined(args->items[i], fd, bits, list, tab, exit);
return result;
diff --git a/tools/d2c/args/manager.h b/tools/d2c/args/manager.h
index 9332b2b..de69105 100644
--- a/tools/d2c/args/manager.h
+++ b/tools/d2c/args/manager.h
@@ -25,7 +25,10 @@
#define _TOOLS_D2C_ARGS_MANAGER_H
-#include "../pproc.h"
+#ifndef NDEBUG
+# include <sys/types.h>
+#endif
+
#include "../bits/manager.h"
@@ -105,10 +108,10 @@ bool compute_arg_expr_size(const arg_expr_t *, const coding_bits *, const conv_l
bool ensure_arg_expr_content_fully_marked(arg_expr_t *, const coding_bits *, const conv_list *);
/* S'assure de la déclaration des expressions pre-requises. */
-bool ensure_arg_expr_content_fully_declared(arg_expr_t *, int, const coding_bits *, const conv_list *, const pre_processor *, unsigned int);
+bool ensure_arg_expr_content_fully_declared(arg_expr_t *, int, const coding_bits *, const conv_list *, const char *);
/* S'assure de la définition des expressions pre-requises. */
-bool ensure_arg_expr_content_fully_defined(arg_expr_t *, int, const char *, const coding_bits *, const conv_list *, const pre_processor *, bool *);
+bool ensure_arg_expr_content_fully_defined(arg_expr_t *, int, const coding_bits *, const conv_list *, const char *, bool *);
/* Définit une expression utilisée dans une conversion. */
bool define_arg_expr(const arg_expr_t *, int, const coding_bits *, const conv_list *);
@@ -122,6 +125,9 @@ bool define_arg_expr(const arg_expr_t *, int, const coding_bits *, const conv_li
typedef struct _arg_list_t arg_list_t;
+/* Crée une liste vide d'arguments de conversion. */
+arg_list_t *build_empty_arg_list(void);
+
/* Crée une liste d'arguments de conversion. */
arg_list_t *build_arg_list(arg_expr_t *);
@@ -131,14 +137,19 @@ void delete_arg_list(arg_list_t *);
/* Ajoute un élément à une liste d'arguments de conversion. */
arg_list_t *extend_arg_list(arg_list_t *, arg_expr_t *);
+/* Indique le nombre d'arguments présents dans la liste. */
+#ifndef NDEBUG
+size_t get_arg_list_size(const arg_list_t *);
+#endif
+
/* S'assure du marquage des expressions pre-requises. */
bool ensure_arg_list_content_fully_marked(arg_list_t *, const coding_bits *, const conv_list *);
/* S'assure de la déclaration des expressions pre-requises. */
-bool ensure_arg_list_content_fully_declared(arg_list_t *, int, const coding_bits *, const conv_list *, const pre_processor *, unsigned int);
+bool ensure_arg_list_content_fully_declared(arg_list_t *, int, const coding_bits *, const conv_list *, const char *);
/* S'assure de la définition des expressions pre-requises. */
-bool ensure_arg_list_content_fully_defined(arg_list_t *, int, const char *, const coding_bits *, const conv_list *, const pre_processor *, bool *);
+bool ensure_arg_list_content_fully_defined(arg_list_t *, int, const coding_bits *, const conv_list *, const char *, bool *);
/* Définit les variables associées à un appel de fonction. */
bool define_arg_list(const arg_list_t *, int, const coding_bits *, const conv_list *);
diff --git a/tools/d2c/args/tokens.l b/tools/d2c/args/tokens.l
index 9851f62..9645ba2 100644
--- a/tools/d2c/args/tokens.l
+++ b/tools/d2c/args/tokens.l
@@ -51,7 +51,7 @@
<binval>[01][01]* { yylvalp->string = strdup(yytext); return BINVAL; }
<binval>"'" { yy_pop_state(); }
-\"[^\"]*\" { yylvalp->string = strndup(yytext + 1, strlen(yytext) - 2); printf("str = '%s'\n", yylvalp->string); return STRING; }
+\"[^\"]*\" { yylvalp->string = strndup(yytext + 1, strlen(yytext) - 2); return STRING; }
"0x" { yy_push_state(hexval); }
<hexval>[0-9a-f][0-9a-f]* { yylvalp->string = strdup(yytext); yy_pop_state(); return HEXVAL; }
@@ -71,5 +71,12 @@
[ ]+ { }
+. {
+ char *msg;
+ asprintf(&msg, "Unhandled token in d2c args block: '%s'", yytext);
+ YY_FATAL_ERROR(msg);
+ free(msg);
+ }
+
%%