#include "libpspp/str.h"
#include "language/lexer/token.h"
+struct macro_expander;
+
struct macro_param
{
- char *name; /* NULL for a positional parameter. */
+ bool positional; /* Is this a positional parameter? */
+ char *name; /* "!1" or "!name". */
struct tokens def; /* Default expansion. */
bool expand_arg; /* Macro-expand the argument? */
size_t n_params;
struct substring body;
+ struct tokens body_tokens;
};
void macro_destroy (struct macro *);
struct hmap macros;
};
+struct macro_set *macro_set_create (void);
+void macro_set_destroy (struct macro_set *);
const struct macro *macro_set_find (const struct macro_set *,
const char *);
-
-struct macro_expander *macro_expander_create (const struct macro_set *,
- const struct token *);
+void macro_set_add (struct macro_set *, struct macro *);
+
+static inline bool
+macro_set_is_empty (const struct macro_set *set)
+{
+ return hmap_is_empty (&set->macros);
+}
+\f
+/* Macro expansion. */
+
+int macro_expander_create (const struct macro_set *,
+ const struct token *,
+ struct macro_expander **);
void macro_expander_destroy (struct macro_expander *);
int macro_expander_add (struct macro_expander *, const struct token *);