00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef lestes__lang__cplus__lex___macro_body_hh___included
00029 #define lestes__lang__cplus__lex___macro_body_hh___included
00030
00031
00032
00033
00034
00035
00036 #include <lestes/common.hh>
00037 #include <lestes/lang/cplus/lex/macro_item.hh>
00038 #include <lestes/std/vector.hh>
00039
00040 package(lestes);
00041
00042 package(std);
00043
00044 class source_location;
00045 end_package(std);
00046
00047 package(lang);
00048 package(cplus);
00049 package(lex);
00050
00051
00052 class token_input;
00053 class token_sequence;
00054 class macro_head;
00055 class macro_arguments;
00056 class macro_storage;
00057
00058
00059
00060
00061 class macro_body: public ::lestes::std::object {
00062 public:
00063
00064 typedef enum { BEGIN, PARSED, DEAD } state_type;
00065
00066 bool parse(const ptr<token_input> &input);
00067
00068 bool parse(const ptr<token_input> &input, const ptr<macro_head> &head);
00069
00070 ptr<token_sequence> expand(const ptr<source_location> &loc);
00071
00072 ptr<token_sequence> expand(const ptr<source_location> &loc,
00073 const ptr<macro_arguments> &mas, const ptr<macro_storage> ¯os);
00074
00075 state_type state_get(void) const;
00076
00077 bool equals(const ptr<macro_body> &other) const;
00078
00079 static ptr<macro_body> create(void);
00080 protected:
00081
00082 macro_body(void);
00083
00084 virtual void gc_mark(void);
00085 private:
00086
00087 typedef ::lestes::std::vector< srp<macro_item> > items_type;
00088
00089 state_type state;
00090
00091 srp<items_type> items;
00092 };
00093
00094 end_package(lex);
00095 end_package(cplus);
00096 end_package(lang);
00097 end_package(lestes);
00098
00099 #endif
00100