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
This commit is contained in:
Josh Holtrop 2009-02-16 20:51:59 +00:00
parent 4d5faf8362
commit 69c5fdd1e6
5 changed files with 143 additions and 157 deletions

View File

@ -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)

View File

@ -8,8 +8,8 @@ void Node::addChildren(refptr<Node> 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<Node> >::const_iterator it = other->m_children.begin();
it != other->m_children.end();
it++)
{
addChild(*it);

View File

@ -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 <vector>
class Node
@ -14,13 +16,12 @@ class Node
virtual void process(refptr<Scene> scene) {}
virtual int getInteger() { return 0; }
virtual refptr<Material> getMaterial()
{
return refptr<Material>(NULL);
}
virtual double getNumber() { return 0.0; }
virtual refptr<Vector> getVector()
{
return refptr<Vector>(NULL);
@ -30,10 +31,49 @@ class Node
std::vector< refptr<Node> > 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<Vector> m_vector;
};
class VFOVNode : public Node
{
};
class WidthNode : public IntegerNode
{
public:
WidthNode(int i) : IntegerNode(i) {}
};
#endif

View File

@ -90,35 +90,10 @@ static Scene * g_scene;
%%
scene: SCENE LCURLY scene_items RCURLY {
refptr<Node> node = $3;
while ( ! node.isNull() )
{
/* process this scene item */
refptr<Node> 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> light = new Light();
refptr<Node> 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> material = new Material();
refptr<Node> 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> 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;
}

View File

@ -3,6 +3,7 @@
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
#include <fstream>
using namespace std;
int preprocess(const char * fileName)