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___evaluator_hh___included
00029 #define lestes__lang__cplus__lex___evaluator_hh___included
00030
00031
00032
00033
00034
00035
00036
00037 #include <lestes/common.hh>
00038 #include <lestes/std/vector.hh>
00039 #include <lestes/lang/cplus/lex/pp_filter.hh>
00040 package(lestes);
00041 package(lang);
00042 package(cplus);
00043 package(lex);
00044
00045
00046 class expander;
00047 class unit_part;
00048 class pp_token;
00049 class token_sequence;
00050 class macro_storage;
00051 class named_istream;
00052 class file_system;
00053
00054
00055
00056
00057
00058
00059
00060 class evaluator: public pp_filter {
00061 public:
00062
00063 bool pragma_flag_get(void) const;
00064
00065 ptr<pp_token> read(void);
00066
00067 static ptr<evaluator> create(const ptr<file_system> &a_fs, const lstring &file_name);
00068 protected:
00069
00070 evaluator(const ptr<file_system> &a_fs, const lstring &file_name);
00071
00072 virtual void gc_mark(void);
00073 private:
00074
00075 typedef enum {
00076 EMPTY,
00077 START,
00078 BUFFER,
00079 END,
00080 } state_type;
00081 enum {
00082
00083 NESTING_LIMIT = 16
00084 };
00085
00086 typedef ::lestes::std::vector< srp<unit_part> > includes_type;
00087
00088 ptr<pp_token> process_directive(void);
00089
00090 ptr<pp_token> parse_include(void);
00091
00092 void check_extra_tokens(const lstring &name);
00093
00094 void push_stream(const ptr<named_istream> &ns, const ptr<source_location> &loc);
00095
00096 void pop_stream(void);
00097
00098 srp<file_system> fs;
00099
00100 state_type state;
00101
00102 bool active;
00103
00104 srp<macro_storage> macros;
00105
00106 srp<includes_type> includes;
00107
00108 srp<expander> input;
00109
00110 srp<unit_part> part;
00111
00112 srp<token_sequence> buffer;
00113
00114 bool pragma_flag;
00115
00116 ulint nesting;
00117
00118 evaluator(const evaluator ©);
00119
00120 evaluator &operator=(const evaluator &rhs);
00121 };
00122
00123 end_package(lex);
00124 end_package(cplus);
00125 end_package(lang);
00126 end_package(lestes);
00127
00128 #endif
00129