00001 00005 #ifndef Parser_h 00006 #define Parser_h 00007 00008 #include "Vector.h" 00009 #include "Point.h" 00010 #include "Color.h" 00011 #include <iostream> 00012 #include <string> 00013 #include <map> 00014 00015 class Camera; 00016 class Background; 00017 class Light; 00018 class Material; 00019 class Object; 00020 class Scene; 00021 class Triangle; 00022 00023 class Parser { 00024 00025 struct Token { 00026 enum type { 00027 end_of_file, 00028 integer, real, string, 00029 left_brace, right_brace, 00030 left_bracket, right_bracket, 00031 comma 00032 }; 00033 type token_type; 00034 std::string string_value; 00035 int integer_value; 00036 double real_value; 00037 int line_number; 00038 int column_number; 00039 }; 00040 std::istream &input; 00041 int line_number; 00042 int column_number; 00043 Token next_token; 00044 Material *default_material; 00045 std::map< std::string, Material * > defined_materials; 00046 std::map< std::string, Object * > defined_objects; 00047 00048 void throwParseException( 00049 std::string const &message ) const; 00050 00051 void readNextToken(); 00052 bool peek(Token::type const type ); 00053 bool peek(std::string const &keyword ); 00054 Token match( 00055 Token::type const type, 00056 std::string const &failure_message ); 00057 Token match( 00058 std::string const &keyword, 00059 std::string const &failure_message ); 00060 00061 std::string parseString(); 00062 bool parseBoolean(); 00063 int parseInteger(); 00064 double parseReal(); 00065 Vector const parseVector(); 00066 Point const parsePoint(); 00067 Color const parseColor(); 00068 00069 Camera *parsePinholeCamera(); 00070 Camera *parseCamera(); 00071 00072 Background *parseConstantBackground(); 00073 Background *parseBackground(); 00074 00075 Light *parsePointLight(); 00076 Light *parseLight(); 00077 00078 Material *parseLambertianMaterial(); 00079 Material *parseMaterial(); 00080 00081 Object *parseGroupObject(); 00082 Object *parsePlaneObject(); 00083 Object *parseSphereObject(); 00084 Object *parseCylObject(); 00085 Object *parseTriangleObject(); 00086 Object *parseRingObject(); 00087 Object *parseBoxObject(); 00088 Object *parseObject(); 00089 00090 public: 00091 00092 Parser( 00093 std::istream &input ); 00094 00095 Scene *parseScene( 00096 std::string &filename ); 00097 00098 }; 00099 00100 #endif