+ char ***names, size_t *n, int opts);
+\f
+/* This variable parser supports the unusual situation where set of variables
+ has to be parsed before the associated dictionary is available. Thus,
+ parsing proceeds in two phases: first, the variables are parsed in a vector
+ of "struct var_syntax"; second, when the dictionary becomes available, the
+ structs are turned into "struct variable"s. */
+
+struct var_syntax
+ {
+ char *first; /* Always nonnull. */
+ char *last; /* Nonnull for var ranges (e.g. "a TO b"). */
+ };
+void var_syntax_destroy (struct var_syntax *, size_t n);
+
+bool var_syntax_parse (struct lexer *, struct var_syntax **, size_t *);
+bool var_syntax_evaluate (const struct var_syntax *, size_t,
+ const struct dictionary *,
+ struct variable ***, size_t *, int opts);
+
+/* Const wrappers */
+
+static inline const struct variable *
+parse_variable_const (struct lexer *l, const struct dictionary *d)
+{
+ return parse_variable (l, d);
+}
+
+static inline bool
+parse_variables_const (struct lexer *l, const struct dictionary *d,
+ const struct variable ***v, size_t *s,
+ int opts)
+{
+ return parse_variables (l, d, (struct variable ***) v, s, opts);
+}
+
+static inline bool
+parse_variables_const_pool (struct lexer *l, struct pool *p,
+ const struct dictionary *d,
+ const struct variable ***v, size_t *s, int opts)
+{
+ return parse_variables_pool (l, p, d, (struct variable ***) v, s, opts);
+}
+
+
+
+static inline struct const_var_set *
+const_var_set_create_from_dict (const struct dictionary *d)
+{
+ return (struct const_var_set *) var_set_create_from_dict (d);
+}
+
+static inline struct const_var_set *
+const_var_set_create_from_array (const struct variable *const *var,
+ size_t s)
+{
+ return (struct const_var_set *) var_set_create_from_array ((struct variable *const *) var, s);
+}
+
+
+static inline bool
+parse_const_var_set_vars (struct lexer *l, const struct const_var_set *vs,
+ const struct variable ***v, size_t *s, int opts)
+{
+ return parse_var_set_vars (l, (const struct var_set *) vs,
+ (struct variable ***) v, s, opts);
+}
+
+static inline void
+const_var_set_destroy (struct const_var_set *vs)
+{
+ var_set_destroy ((struct var_set *) vs);
+}
+
+/* Match a variable.
+ If the match succeeds, the variable will be placed in VAR.
+ Returns true if successful */
+bool
+lex_match_variable (struct lexer *lexer, const struct dictionary *dict, const struct variable **var);
+
+struct interaction;
+
+/* Parse an interaction.
+ If not successful return false.
+ Otherwise, a newly created interaction will be placed in IACT.
+ It is the caller's responsibility to destroy this interaction.
+ */
+bool
+parse_design_interaction (struct lexer *lexer, const struct dictionary *dict, struct interaction **iact);
+
+