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
|
PARSER := parser
|
||||||
|
|
||||||
COBJS := lex.yy.o
|
COBJS := lex.yy.o
|
||||||
CXXOBJS := $(PARSER).tab.o
|
CXXOBJS := $(PARSER).tab.o $(patsubst %.cc,%.o,$(wildcard *.cc))
|
||||||
OBJS := $(COBJS) $(CXXOBJS)
|
OBJS := $(COBJS) $(CXXOBJS)
|
||||||
|
|
||||||
all: $(OBJS)
|
all: $(OBJS)
|
||||||
|
@ -8,8 +8,8 @@ void Node::addChildren(refptr<Node> other)
|
|||||||
if (other.isNull())
|
if (other.isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (typeof(other.m_children)::const_iterator it = other.m_children.begin();
|
for (vector< refptr<Node> >::const_iterator it = other->m_children.begin();
|
||||||
it != other.m_children.end();
|
it != other->m_children.end();
|
||||||
it++)
|
it++)
|
||||||
{
|
{
|
||||||
addChild(*it);
|
addChild(*it);
|
||||||
|
100
parser/nodes.h
100
parser/nodes.h
@ -2,8 +2,10 @@
|
|||||||
#ifndef NODES_H
|
#ifndef NODES_H
|
||||||
#define NODES_H NODES_H
|
#define NODES_H NODES_H
|
||||||
|
|
||||||
|
#include "util/refptr.h"
|
||||||
#include "util/Vector.h"
|
#include "util/Vector.h"
|
||||||
#include "main/Material.h"
|
#include "main/Material.h"
|
||||||
|
#include "main/Scene.h"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class Node
|
class Node
|
||||||
@ -14,13 +16,12 @@ class Node
|
|||||||
|
|
||||||
virtual void process(refptr<Scene> scene) {}
|
virtual void process(refptr<Scene> scene) {}
|
||||||
|
|
||||||
|
virtual int getInteger() { return 0; }
|
||||||
virtual refptr<Material> getMaterial()
|
virtual refptr<Material> getMaterial()
|
||||||
{
|
{
|
||||||
return refptr<Material>(NULL);
|
return refptr<Material>(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual double getNumber() { return 0.0; }
|
virtual double getNumber() { return 0.0; }
|
||||||
|
|
||||||
virtual refptr<Vector> getVector()
|
virtual refptr<Vector> getVector()
|
||||||
{
|
{
|
||||||
return refptr<Vector>(NULL);
|
return refptr<Vector>(NULL);
|
||||||
@ -30,10 +31,49 @@ class Node
|
|||||||
std::vector< refptr<Node> > m_children;
|
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 CameraNode : public Node
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DiffuseNode : public Node
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
class HeightNode : public IntegerNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
HeightNode(int i) : IntegerNode(i) {}
|
||||||
|
};
|
||||||
|
|
||||||
class ItemsNode : public Node
|
class ItemsNode : public Node
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
@ -42,30 +82,62 @@ class LightNode : public Node
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class LookAtNode : public Node
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
class MaterialNode : public Node
|
class MaterialNode : public Node
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
class NumberNode : public Node
|
class MultisampleNode : public IntegerNode
|
||||||
{
|
{
|
||||||
public:
|
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:
|
public:
|
||||||
RadiusNode(double radius) { m_radius = radius; }
|
RadiusNode(double d) : NumberNode(d) {}
|
||||||
double getNumber() { return m_radius; }
|
};
|
||||||
|
|
||||||
protected:
|
class ReflectanceNode : public NumberNode
|
||||||
double m_radius;
|
{
|
||||||
|
public:
|
||||||
|
ReflectanceNode(double d) : NumberNode(d) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ShapeNode : public Node
|
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
|
class VectorNode : public Node
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -76,5 +148,15 @@ class VectorNode : public Node
|
|||||||
refptr<Vector> m_vector;
|
refptr<Vector> m_vector;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class VFOVNode : public Node
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
class WidthNode : public IntegerNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WidthNode(int i) : IntegerNode(i) {}
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
193
parser/parser.yy
193
parser/parser.yy
@ -90,35 +90,10 @@ static Scene * g_scene;
|
|||||||
%%
|
%%
|
||||||
|
|
||||||
scene: SCENE LCURLY scene_items RCURLY {
|
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 {
|
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 {
|
camera_item: POSITION vector {
|
||||||
$$ = new Node();
|
$$ = new PositionNode();
|
||||||
$$->type = POSITION;
|
$$->addChild($2);
|
||||||
$$->the_Vector = $2->the_Vector;
|
|
||||||
}
|
}
|
||||||
| LOOKAT vector {
|
| LOOKAT vector {
|
||||||
$$ = new Node();
|
$$ = new LookAtNode();
|
||||||
$$->type = LOOKAT;
|
$$->addChild($2);
|
||||||
$$->the_Vector = $2->the_Vector;
|
|
||||||
}
|
}
|
||||||
| UP vector {
|
| UP vector {
|
||||||
$$ = new Node();
|
$$ = new UpNode();
|
||||||
$$->type = UP;
|
$$->addChild($2);
|
||||||
$$->the_Vector = $2->the_Vector;
|
|
||||||
}
|
}
|
||||||
| VFOV vector {
|
| VFOV vector {
|
||||||
$$ = new Node();
|
$$ = new VFOVNode();
|
||||||
$$->type = VFOV;
|
$$->addChild($2);
|
||||||
$$->the_Vector = $2->the_Vector;
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -169,121 +140,65 @@ intersect: INTERSECT LCURLY boolean_items RCURLY
|
|||||||
;
|
;
|
||||||
|
|
||||||
light: LIGHT LCURLY light_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_items: /* empty */
|
||||||
| light_item light_items {
|
| light_item light_items {
|
||||||
$$ = new Node();
|
|
||||||
$$->the_Node = $1;
|
|
||||||
$$->the_tail = $2;
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
light_item: POSITION vector {
|
light_item: POSITION vector {
|
||||||
$$ = new Node();
|
$$ = new PositionNode();
|
||||||
$$->type = POSITION;
|
$$->addChild($2);
|
||||||
$$->the_Vector = $2->the_Vector;
|
|
||||||
}
|
}
|
||||||
| DIFFUSE vector {
|
| DIFFUSE vector {
|
||||||
$$ = new Node();
|
$$ = new DiffuseNode();
|
||||||
$$->type = DIFFUSE;
|
$$->addChild($2);
|
||||||
$$->the_Color = new Color(* $2->the_Vector);
|
|
||||||
}
|
}
|
||||||
| SPECULAR vector {
|
| SPECULAR vector {
|
||||||
$$ = new Node();
|
$$ = new SpecularNode();
|
||||||
$$->type = SPECULAR;
|
$$->addChild($2);
|
||||||
$$->the_Color = new Color(* $2->the_Vector);
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
material: MATERIAL LCURLY material_items RCURLY {
|
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_items: /* empty */
|
||||||
| material_item material_items {
|
| material_item material_items {
|
||||||
$$ = new Node();
|
$$ = new ItemsNode();
|
||||||
$$->the_Node = $1;
|
$$->addChild($1);
|
||||||
$$->the_tail = $2;
|
$$->addChildren($2);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
material_item: AMBIENT vector {
|
material_item: AMBIENT vector {
|
||||||
$$ = new Node();
|
$$ = new AmbientNode();
|
||||||
$$->type = AMBIENT;
|
$$->addChild($2);
|
||||||
$$->the_Color = new Color(* $2->the_Vector);
|
|
||||||
}
|
}
|
||||||
| DIFFUSE vector {
|
| DIFFUSE vector {
|
||||||
$$ = new Node();
|
$$ = new DiffuseNode();
|
||||||
$$->type = DIFFUSE;
|
$$->addChild($2);
|
||||||
$$->the_Color = new Color(* $2->the_Vector);
|
|
||||||
}
|
}
|
||||||
| SPECULAR vector {
|
| SPECULAR vector {
|
||||||
$$ = new Node();
|
$$ = new SpecularNode();
|
||||||
$$->type = SPECULAR;
|
$$->addChild($2);
|
||||||
$$->the_Color = new Color(* $2->the_Vector);
|
|
||||||
}
|
}
|
||||||
| REFLECTANCE number {
|
| REFLECTANCE number {
|
||||||
$$ = new Node();
|
$$ = new ReflectanceNode($2->getNumber());
|
||||||
$$->type = REFLECTANCE;
|
|
||||||
$$->the_double = $2->the_double;
|
|
||||||
}
|
}
|
||||||
| SHININESS number {
|
| SHININESS number {
|
||||||
$$ = new Node();
|
$$ = new ShininessNode($2->getNumber());
|
||||||
$$->type = SHININESS;
|
|
||||||
$$->the_double = $2->the_double;
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
number: DEC_NUMBER {
|
number: DEC_NUMBER {
|
||||||
double * ptr = new double;
|
$$ = new NumberNode(atoi(yytext));
|
||||||
*ptr = atoi(yytext);
|
|
||||||
$$ = new Node();
|
|
||||||
$$->the_double = ptr;
|
|
||||||
}
|
}
|
||||||
| REAL_NUMBER {
|
| REAL_NUMBER {
|
||||||
double * ptr = new double;
|
$$ = new NumberNode(atof(yytext));
|
||||||
*ptr = atof(yytext);
|
|
||||||
$$ = new Node();
|
|
||||||
$$->the_double = ptr;
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -292,42 +207,36 @@ options: OPTIONS LCURLY options_items RCURLY { $$ = $3; }
|
|||||||
|
|
||||||
options_items: /* empty */
|
options_items: /* empty */
|
||||||
| options_item options_items {
|
| options_item options_items {
|
||||||
$$ = new Node();
|
$$ = new ItemsNode();
|
||||||
$$->the_Node = $1;
|
$$->addChild($1);
|
||||||
$$->the_tail = $2;
|
$$->addChildren($2);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
options_item: WIDTH number {
|
options_item: WIDTH DEC_NUMBER {
|
||||||
$$ = new Node();
|
$$ = new WidthNode(atoi(yytext));
|
||||||
$$->type = WIDTH;
|
|
||||||
$$->the_double = $2->the_double;
|
|
||||||
}
|
}
|
||||||
| HEIGHT number {
|
| HEIGHT DEC_NUMBER {
|
||||||
$$ = new Node();
|
$$ = new HeightNode(atoi(yytext));
|
||||||
$$->type = HEIGHT;
|
|
||||||
$$->the_double = $2->the_double;
|
|
||||||
}
|
}
|
||||||
| MULTISAMPLE number {
|
| MULTISAMPLE DEC_NUMBER {
|
||||||
$$ = new Node();
|
$$ = new MultisampleNode(atoi(yytext));
|
||||||
$$->type = MULTISAMPLE;
|
|
||||||
$$->the_double = $2->the_double;
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
plane: PLANE LPAREN vector COMMA number RPAREN LCURLY plane_items RCURLY {
|
plane: PLANE LCURLY plane_items RCURLY {
|
||||||
Plane * plane = new Plane((*($3->the_Vector))[0],
|
$$ = new PlaneNode();
|
||||||
(*($3->the_Vector))[1],
|
|
||||||
(*($3->the_Vector))[2],
|
|
||||||
*($5->the_double));
|
|
||||||
$$ = new Node();
|
|
||||||
$$->the_Shape = plane;
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
plane_items: shape_items { $$ = $1; }
|
plane_items: plane_item plane_items {
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
plane_item: POSITION vector, number
|
||||||
|
| shape_item
|
||||||
|
;
|
||||||
|
|
||||||
radius: RADIUS number {
|
radius: RADIUS number {
|
||||||
$$ = new RadiusNode($2->getNumber());
|
$$ = new RadiusNode($2->getNumber());
|
||||||
}
|
}
|
||||||
@ -368,9 +277,8 @@ shape_item:
|
|||||||
;
|
;
|
||||||
|
|
||||||
sphere: SPHERE LCURLY sphere_items RCURLY {
|
sphere: SPHERE LCURLY sphere_items RCURLY {
|
||||||
Sphere * sphere = new Sphere(*($3->the_double));
|
|
||||||
$$ = new SphereNode();
|
$$ = 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 {
|
vector: LESS number COMMA number COMMA number GREATER {
|
||||||
refptr<Vector> vector = new Vector();
|
refptr<Vector> vector = new Vector();
|
||||||
(*vector)[0] = * $2->getNumber();
|
(*vector)[0] = $2->getNumber();
|
||||||
(*vector)[1] = * $4->getNumber();
|
(*vector)[1] = $4->getNumber();
|
||||||
(*vector)[2] = * $6->getNumber();
|
(*vector)[2] = $6->getNumber();
|
||||||
$$ = new VectorNode(vector);
|
$$ = new VectorNode(vector);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -420,8 +328,3 @@ int Scene::parse(const char * fileName)
|
|||||||
yyparse();
|
yyparse();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node::Node()
|
|
||||||
{
|
|
||||||
type = -1;
|
|
||||||
}
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
int preprocess(const char * fileName)
|
int preprocess(const char * fileName)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user