X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Fmacro.h;fp=src%2Flanguage%2Flexer%2Fmacro.h;h=c10ce8e3cd2cdc4f40260698e41eed65e8c348e9;hb=edb4c98e1bbb8e0961c5e9f87452ed65ba0f8404;hp=0000000000000000000000000000000000000000;hpb=320622191b3de640da6ba0e347a94d28493711ae;p=pspp diff --git a/src/language/lexer/macro.h b/src/language/lexer/macro.h new file mode 100644 index 0000000000..c10ce8e3cd --- /dev/null +++ b/src/language/lexer/macro.h @@ -0,0 +1,127 @@ +/* PSPP - a program for statistical analysis. + Copyright (C) 2021 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef MACRO_H +#define MACRO_H 1 + +#include +#include + +#include "libpspp/hmap.h" +#include "libpspp/str.h" +#include "language/lexer/segment.h" +#include "language/lexer/token.h" + +struct macro_expander; + +struct macro_token + { + struct token token; + struct substring representation; + }; + +void macro_token_copy (struct macro_token *, const struct macro_token *); +void macro_token_uninit (struct macro_token *); + +void macro_token_to_representation (struct macro_token *, struct string *); + +bool is_macro_keyword (struct substring); + +struct macro_tokens + { + struct macro_token *mts; + size_t n; + size_t allocated; + }; + +void macro_tokens_copy (struct macro_tokens *, const struct macro_tokens *); +void macro_tokens_uninit (struct macro_tokens *); +struct macro_token *macro_tokens_add_uninit (struct macro_tokens *); +void macro_tokens_add (struct macro_tokens *, const struct macro_token *); + +void macro_tokens_from_string (struct macro_tokens *, const struct substring, + enum segmenter_mode); + +void macro_tokens_to_representation (struct macro_tokens *, struct string *, + size_t *ofs, size_t *len); + +void macro_tokens_print (const struct macro_tokens *, FILE *); + +struct macro_param + { + bool positional; /* Is this a positional parameter? */ + char *name; /* "!1" or "!name". */ + struct macro_tokens def; /* Default expansion. */ + bool expand_arg; /* Macro-expand the argument? */ + + enum + { + ARG_N_TOKENS, + ARG_CHAREND, + ARG_ENCLOSE, + ARG_CMDEND + } + arg_type; + union + { + int n_tokens; + struct token charend; + struct token enclose[2]; + }; + }; + +struct macro + { + struct hmap_node hmap_node; /* Indexed by 'name'. */ + char *name; + + struct macro_param *params; + size_t n_params; + + struct macro_tokens body; + }; + +void macro_destroy (struct macro *); + +struct macro_set + { + 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 *); +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); +} + +/* 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 macro_token *); + +void macro_expander_get_expansion (struct macro_expander *, struct macro_tokens *); + +#endif /* macro.h */