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:
parent
4d5faf8362
commit
69c5fdd1e6
@ -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)
|
||||
|
@ -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);
|
||||
|
100
parser/nodes.h
100
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 <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
|
||||
|
||||
|
193
parser/parser.yy
193
parser/parser.yy
@ -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;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
using namespace std;
|
||||
|
||||
int preprocess(const char * fileName)
|
||||
|
Loading…
x
Reference in New Issue
Block a user