From 69c5fdd1e6a74ef4ecbe093369b72c09f1c3c728 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 16 Feb 2009 20:51:59 +0000 Subject: [PATCH] updated parser to compile again, still have non-virtual destructor compiler warnings git-svn-id: svn://anubis/fart/trunk@109 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- parser/Makefile | 2 +- parser/nodes.cc | 4 +- parser/nodes.h | 100 ++++++++++++++++++++--- parser/parser.yy | 193 +++++++++++--------------------------------- parser/preparser.cc | 1 + 5 files changed, 143 insertions(+), 157 deletions(-) diff --git a/parser/Makefile b/parser/Makefile index bd897a5..36224ba 100644 --- a/parser/Makefile +++ b/parser/Makefile @@ -5,7 +5,7 @@ BISON := bison PARSER := parser COBJS := lex.yy.o -CXXOBJS := $(PARSER).tab.o +CXXOBJS := $(PARSER).tab.o $(patsubst %.cc,%.o,$(wildcard *.cc)) OBJS := $(COBJS) $(CXXOBJS) all: $(OBJS) diff --git a/parser/nodes.cc b/parser/nodes.cc index 0853e75..a734d86 100644 --- a/parser/nodes.cc +++ b/parser/nodes.cc @@ -8,8 +8,8 @@ void Node::addChildren(refptr other) if (other.isNull()) return; - for (typeof(other.m_children)::const_iterator it = other.m_children.begin(); - it != other.m_children.end(); + for (vector< refptr >::const_iterator it = other->m_children.begin(); + it != other->m_children.end(); it++) { addChild(*it); diff --git a/parser/nodes.h b/parser/nodes.h index 2416171..dfe644e 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -2,8 +2,10 @@ #ifndef NODES_H #define NODES_H NODES_H +#include "util/refptr.h" #include "util/Vector.h" #include "main/Material.h" +#include "main/Scene.h" #include class Node @@ -14,13 +16,12 @@ class Node virtual void process(refptr scene) {} + virtual int getInteger() { return 0; } virtual refptr getMaterial() { return refptr(NULL); } - virtual double getNumber() { return 0.0; } - virtual refptr getVector() { return refptr(NULL); @@ -30,10 +31,49 @@ class Node std::vector< refptr > m_children; }; + +class IntegerNode : public Node +{ + public: + IntegerNode(int number) { m_number = number; } + int getInteger() { return m_number; } + + protected: + int m_number; +}; + +class NumberNode : public Node +{ + public: + NumberNode(double number) { m_number = number; } + double getNumber() { return m_number; } + + protected: + double m_number; +}; + +class AmbientNode : public Node +{ +}; + +class BoxNode : public Node +{ +}; + class CameraNode : public Node { }; +class DiffuseNode : public Node +{ +}; + +class HeightNode : public IntegerNode +{ + public: + HeightNode(int i) : IntegerNode(i) {} +}; + class ItemsNode : public Node { }; @@ -42,30 +82,62 @@ class LightNode : public Node { }; +class LookAtNode : public Node +{ +}; + class MaterialNode : public Node { }; -class NumberNode : public Node +class MultisampleNode : public IntegerNode { public: - double getNumber() { return m_number; } + MultisampleNode(int i) : IntegerNode(i) {} }; -class RadiusNode +class PlaneNode : public Node +{ +}; + +class PositionNode : public Node +{ +}; + +class RadiusNode : public NumberNode { public: - RadiusNode(double radius) { m_radius = radius; } - double getNumber() { return m_radius; } + RadiusNode(double d) : NumberNode(d) {} +}; - protected: - double m_radius; +class ReflectanceNode : public NumberNode +{ + public: + ReflectanceNode(double d) : NumberNode(d) {} }; class ShapeNode : public Node { }; +class ShininessNode : public NumberNode +{ + public: + ShininessNode(double d) : NumberNode(d) {} +}; + +class SpecularNode : public Node +{ +}; + +class SphereNode : public Node +{ +}; + +class UpNode : public Node +{ +}; + class VectorNode : public Node { public: @@ -76,5 +148,15 @@ class VectorNode : public Node refptr m_vector; }; +class VFOVNode : public Node +{ +}; + +class WidthNode : public IntegerNode +{ + public: + WidthNode(int i) : IntegerNode(i) {} +}; + #endif diff --git a/parser/parser.yy b/parser/parser.yy index f211ead..92168df 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -90,35 +90,10 @@ static Scene * g_scene; %% scene: SCENE LCURLY scene_items RCURLY { - refptr node = $3; - while ( ! node.isNull() ) - { - /* process this scene item */ - refptr thisNode = node->the_Node; - switch (thisNode->type) - { - case Node_Shape: - g_scene->m_shapes.push_back(thisNode->the_Shape); - break; - case Node_Camera: - break; - case Node_Light: - break; - case Node_Options: - break; - } - node = node->the_tail; - } } ; boolean_items: shape shape boolean_items_more { - $$ = new Node(); - $$->the_Node = $1; - $$->the_tail = new Node(); - $$->the_tail->the_Node = $2; - $$->the_tail->the_tail = new Node(); - $$->the_tail->the_tail->the_Node = $3; } ; @@ -144,24 +119,20 @@ camera_items: /* empty */ ; camera_item: POSITION vector { - $$ = new Node(); - $$->type = POSITION; - $$->the_Vector = $2->the_Vector; + $$ = new PositionNode(); + $$->addChild($2); } | LOOKAT vector { - $$ = new Node(); - $$->type = LOOKAT; - $$->the_Vector = $2->the_Vector; + $$ = new LookAtNode(); + $$->addChild($2); } | UP vector { - $$ = new Node(); - $$->type = UP; - $$->the_Vector = $2->the_Vector; + $$ = new UpNode(); + $$->addChild($2); } | VFOV vector { - $$ = new Node(); - $$->type = VFOV; - $$->the_Vector = $2->the_Vector; + $$ = new VFOVNode(); + $$->addChild($2); } ; @@ -169,121 +140,65 @@ intersect: INTERSECT LCURLY boolean_items RCURLY ; light: LIGHT LCURLY light_items RCURLY { - $$ = new Node(); - refptr light = new Light(); - refptr node = $3; - while ( ! node.isNull() ) - { - switch (node->type) - { - case POSITION: - break; - } - node = node->the_tail; - } } ; light_items: /* empty */ | light_item light_items { - $$ = new Node(); - $$->the_Node = $1; - $$->the_tail = $2; } ; light_item: POSITION vector { - $$ = new Node(); - $$->type = POSITION; - $$->the_Vector = $2->the_Vector; + $$ = new PositionNode(); + $$->addChild($2); } | DIFFUSE vector { - $$ = new Node(); - $$->type = DIFFUSE; - $$->the_Color = new Color(* $2->the_Vector); + $$ = new DiffuseNode(); + $$->addChild($2); } | SPECULAR vector { - $$ = new Node(); - $$->type = SPECULAR; - $$->the_Color = new Color(* $2->the_Vector); + $$ = new SpecularNode(); + $$->addChild($2); } ; material: MATERIAL LCURLY material_items RCURLY { - $$ = new Node(); - refptr material = new Material(); - refptr node = $3; - while ( ! node.isNull() ) - { - switch (node->type) - { - case AMBIENT: - material->setAmbientColor(*node->the_Color); - break; - case DIFFUSE: - material->setDiffuseColor(* node->the_Color); - break; - case SPECULAR: - material->setSpecularColor(* node->the_Color); - break; - case SHININESS: - material->setShininess(* node->the_double); - break; - case REFLECTANCE: - material->setReflectance(* node->the_double); - break; - } - node = node->the_Node; - } } ; material_items: /* empty */ | material_item material_items { - $$ = new Node(); - $$->the_Node = $1; - $$->the_tail = $2; + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); } ; material_item: AMBIENT vector { - $$ = new Node(); - $$->type = AMBIENT; - $$->the_Color = new Color(* $2->the_Vector); + $$ = new AmbientNode(); + $$->addChild($2); } | DIFFUSE vector { - $$ = new Node(); - $$->type = DIFFUSE; - $$->the_Color = new Color(* $2->the_Vector); + $$ = new DiffuseNode(); + $$->addChild($2); } | SPECULAR vector { - $$ = new Node(); - $$->type = SPECULAR; - $$->the_Color = new Color(* $2->the_Vector); + $$ = new SpecularNode(); + $$->addChild($2); } | REFLECTANCE number { - $$ = new Node(); - $$->type = REFLECTANCE; - $$->the_double = $2->the_double; + $$ = new ReflectanceNode($2->getNumber()); } | SHININESS number { - $$ = new Node(); - $$->type = SHININESS; - $$->the_double = $2->the_double; + $$ = new ShininessNode($2->getNumber()); } ; number: DEC_NUMBER { - double * ptr = new double; - *ptr = atoi(yytext); - $$ = new Node(); - $$->the_double = ptr; + $$ = new NumberNode(atoi(yytext)); } | REAL_NUMBER { - double * ptr = new double; - *ptr = atof(yytext); - $$ = new Node(); - $$->the_double = ptr; + $$ = new NumberNode(atof(yytext)); } ; @@ -292,42 +207,36 @@ options: OPTIONS LCURLY options_items RCURLY { $$ = $3; } options_items: /* empty */ | options_item options_items { - $$ = new Node(); - $$->the_Node = $1; - $$->the_tail = $2; + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); } ; -options_item: WIDTH number { - $$ = new Node(); - $$->type = WIDTH; - $$->the_double = $2->the_double; +options_item: WIDTH DEC_NUMBER { + $$ = new WidthNode(atoi(yytext)); } - | HEIGHT number { - $$ = new Node(); - $$->type = HEIGHT; - $$->the_double = $2->the_double; + | HEIGHT DEC_NUMBER { + $$ = new HeightNode(atoi(yytext)); } - | MULTISAMPLE number { - $$ = new Node(); - $$->type = MULTISAMPLE; - $$->the_double = $2->the_double; + | MULTISAMPLE DEC_NUMBER { + $$ = new MultisampleNode(atoi(yytext)); } ; -plane: PLANE LPAREN vector COMMA number RPAREN LCURLY plane_items RCURLY { - Plane * plane = new Plane((*($3->the_Vector))[0], - (*($3->the_Vector))[1], - (*($3->the_Vector))[2], - *($5->the_double)); - $$ = new Node(); - $$->the_Shape = plane; +plane: PLANE LCURLY plane_items RCURLY { + $$ = new PlaneNode(); } ; -plane_items: shape_items { $$ = $1; } +plane_items: plane_item plane_items { + } ; +plane_item: POSITION vector, number + | shape_item + ; + radius: RADIUS number { $$ = new RadiusNode($2->getNumber()); } @@ -368,9 +277,8 @@ shape_item: ; sphere: SPHERE LCURLY sphere_items RCURLY { - Sphere * sphere = new Sphere(*($3->the_double)); $$ = new SphereNode(); - $$->the_Shape = sphere; + $$->addChild($3); } ; @@ -399,9 +307,9 @@ union: UNION LCURLY boolean_items RCURLY vector: LESS number COMMA number COMMA number GREATER { refptr vector = new Vector(); - (*vector)[0] = * $2->getNumber(); - (*vector)[1] = * $4->getNumber(); - (*vector)[2] = * $6->getNumber(); + (*vector)[0] = $2->getNumber(); + (*vector)[1] = $4->getNumber(); + (*vector)[2] = $6->getNumber(); $$ = new VectorNode(vector); } ; @@ -420,8 +328,3 @@ int Scene::parse(const char * fileName) yyparse(); return 0; } - -Node::Node() -{ - type = -1; -} diff --git a/parser/preparser.cc b/parser/preparser.cc index 4b11bf9..2471a9d 100644 --- a/parser/preparser.cc +++ b/parser/preparser.cc @@ -3,6 +3,7 @@ #include #include #include +#include using namespace std; int preprocess(const char * fileName)