Mercurial > ~dholland > hg > ag > index.cgi
diff examples/mpp/mpp.h @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/mpp/mpp.h Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,122 @@ +/* + * AnaGram, a System for Syntax Directed Programming + * C Macro preprocessor + * Global Definitions + * + * Copyright 1993 Parsifal Software. All Rights Reserved. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef MPP_H +#define MPP_H + + +//#define NDEBUG +#include "token.h" +#include <charsink.h> +#include <stack.h> +#include <strdict.h> +#include "ex.h" + +#include "krc.h" +//#include "jrc.h" + +#define N_MACROS 500 // max number of macros +#define N_SYMBOLS 5000 // size of token dictionary + +enum symbol_type_enum {identifier, typedef_name}; + +struct macro_descriptor { + unsigned name; // token dictionary index of name + unsigned* arg_names; // pointer to list of parameter names + unsigned n_args; // number of parameters + token *body; // body of macro + unsigned busy_flag : 1; // set when macro should not be expanded + unsigned parens : 1; // set if macro defined with parens +}; + +struct op_descriptor { + const char *op; + token_id id; +}; + + +// Parser classes + +// Expression evaluator +// member functions are in EX.SYN + +class expression_evaluator : public token_sink { + ex_pcb_type pcb; +public: + expression_evaluator(); + friend token_sink& reset(expression_evaluator &); + token_sink& operator << (token t); + token_sink& operator << (token *tp); + operator long(); +// friend int error(expression_evaluator &); +}; + + +// C parser +// Member Functions are in JRC.SYN or KRC.SYN + +class c_parser: public token_sink { +public: + cc_pcb_type pcb; + c_parser(); + ~c_parser(); + token_sink &operator << (token); + token_sink& operator << (token *); +// friend int error(c_parser &p); + friend c_parser &reset(c_parser &); +}; + + +// Global variables +// Variables are defined in mpp.cpp + +extern expression_evaluator condition; +extern char default_path[]; +extern unsigned defined_value; +extern int if_clause; +extern macro_descriptor macro[]; +extern unsigned macro_id[]; +extern int n_macros; +extern unsigned n_reserved_words; +extern int nest_comments; +extern unsigned one_value; +extern stack<char *> paths; +extern op_descriptor reserved_words[]; +extern string_accumulator sa; +extern token_accumulator ta; +extern token_sink *scanner_sink; +extern string_dictionary td; +extern unsigned token_handles[]; +extern unsigned zero_value; + + +// Function declarations + +token_id classify_token(char *); // ct.syn +void expand_macro(token, unsigned); // asc.syn +void expand_text(token *, int = 0, unsigned * = NULL); // asc.syn +void scan_input(char *); // ts.syn +void syntax_error(const char *); // ts.syn + +#endif