added expression production to grammar, changed grammar refs from number to expression, added BinOpNode class, currently segfaulting :(
git-svn-id: svn://anubis/fart/branches/scene-file-scripting@315 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
parent
cb907de438
commit
20017370f0
@ -1,6 +1,11 @@
|
|||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include "nodes.h"
|
#include "nodes.h"
|
||||||
#include <vector>
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
void Node::addChildren(refptr<Node> other)
|
void Node::addChildren(refptr<Node> other)
|
||||||
@ -19,3 +24,23 @@ void Node::addChildren(refptr<Node> other)
|
|||||||
Node::~Node()
|
Node::~Node()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double BinOpNode::getNumber()
|
||||||
|
{
|
||||||
|
double o = one->getNumber();
|
||||||
|
double t = two->getNumber();
|
||||||
|
switch (m_op)
|
||||||
|
{
|
||||||
|
case '*':
|
||||||
|
return o * t;
|
||||||
|
case '/':
|
||||||
|
return o / t;
|
||||||
|
case '+':
|
||||||
|
return o + t;
|
||||||
|
case '-':
|
||||||
|
return o - t;
|
||||||
|
default:
|
||||||
|
cerr << "Error: BinOpNode created with op '" << m_op << "'" << endl;
|
||||||
|
exit(-3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -15,16 +15,17 @@ class Node
|
|||||||
void addChildren(refptr<Node> other);
|
void addChildren(refptr<Node> other);
|
||||||
std::vector< refptr<Node> > & getChildren() { return m_children; }
|
std::vector< refptr<Node> > & getChildren() { return m_children; }
|
||||||
|
|
||||||
virtual int getInteger() { return 0; }
|
virtual int getInteger() const { return 0; }
|
||||||
virtual double getNumber() { return 0.0; }
|
virtual double getNumber() const { return 0.0; }
|
||||||
virtual refptr<Vector> getVector()
|
virtual refptr<Vector> getVector() const
|
||||||
{
|
{
|
||||||
return refptr<Vector>(NULL);
|
return refptr<Vector>(NULL);
|
||||||
}
|
}
|
||||||
virtual bool isShape() { return false; }
|
virtual bool isShape() const { return false; }
|
||||||
virtual bool isMaterial() { return false; }
|
virtual bool isMaterial() const { return false; }
|
||||||
virtual bool isTransformBlock() { return false; }
|
virtual bool isTransformBlock() const { return false; }
|
||||||
virtual std::string getString() { return ""; }
|
virtual std::string getString() const { return ""; }
|
||||||
|
virtual bool isExpression() const { return false; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::vector< refptr<Node> > m_children;
|
std::vector< refptr<Node> > m_children;
|
||||||
@ -375,5 +376,28 @@ class WidthNode : public IntegerNode
|
|||||||
WidthNode(int i) : IntegerNode(i) {}
|
WidthNode(int i) : IntegerNode(i) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/******** scripting nodes ********/
|
||||||
|
|
||||||
|
class ExpressionNode : public Node
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool isExpression() const { return true; }
|
||||||
|
virtual double getInteger() { return getNumber(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
class BinOpNode : public ExpressionNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BinOpNode(char op, refptr<Node> one, refptr<Node> two)
|
||||||
|
: m_op(op), one(one), two(two)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual double getNumber();
|
||||||
|
protected:
|
||||||
|
char m_op;
|
||||||
|
refptr<Node> one;
|
||||||
|
refptr<Node> two;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
\+ return PLUS;
|
\+ return PLUS;
|
||||||
- return MINUS;
|
- return MINUS;
|
||||||
\* return STAR;
|
\* return TIMES;
|
||||||
\/ return DIVIDE;
|
\/ return DIVIDE;
|
||||||
% return MOD;
|
% return MOD;
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ static refptr<Node> parsed_scene_node;
|
|||||||
|
|
||||||
%token PLUS;
|
%token PLUS;
|
||||||
%token MINUS;
|
%token MINUS;
|
||||||
%token STAR;
|
%token TIMES;
|
||||||
%token DIVIDE;
|
%token DIVIDE;
|
||||||
%token MOD;
|
%token MOD;
|
||||||
|
|
||||||
@ -102,6 +102,10 @@ static refptr<Node> parsed_scene_node;
|
|||||||
|
|
||||||
%token IDENTIFIER;
|
%token IDENTIFIER;
|
||||||
|
|
||||||
|
%left PLUS MINUS
|
||||||
|
%left TIMES DIVIDE
|
||||||
|
%left UMINUS
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
scene: SCENE LCURLY scene_items RCURLY {
|
scene: SCENE LCURLY scene_items RCURLY {
|
||||||
@ -168,7 +172,7 @@ camera_item: POSITION vector3 {
|
|||||||
| UP vector3 {
|
| UP vector3 {
|
||||||
$$ = new UpNode($2->getVector());
|
$$ = new UpNode($2->getVector());
|
||||||
}
|
}
|
||||||
| VFOV number {
|
| VFOV expression {
|
||||||
$$ = new VFOVNode($2->getNumber());
|
$$ = new VFOVNode($2->getNumber());
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -219,7 +223,7 @@ intersect: INTERSECT LCURLY bool_items RCURLY {
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
jitter: JITTER number {
|
jitter: JITTER expression {
|
||||||
$$ = new JitterNode($2->getInteger());
|
$$ = new JitterNode($2->getInteger());
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -284,13 +288,13 @@ material_item: COLOR vector3 {
|
|||||||
| SPECULAR vector3 {
|
| SPECULAR vector3 {
|
||||||
$$ = new SpecularNode($2->getVector());
|
$$ = new SpecularNode($2->getVector());
|
||||||
}
|
}
|
||||||
| REFLECTANCE number {
|
| REFLECTANCE expression {
|
||||||
$$ = new ReflectanceNode($2->getNumber());
|
$$ = new ReflectanceNode($2->getNumber());
|
||||||
}
|
}
|
||||||
| SHININESS number {
|
| SHININESS expression {
|
||||||
$$ = new ShininessNode($2->getNumber());
|
$$ = new ShininessNode($2->getNumber());
|
||||||
}
|
}
|
||||||
| TRANSPARENCY number {
|
| TRANSPARENCY expression {
|
||||||
$$ = new TransparencyNode($2->getNumber());
|
$$ = new TransparencyNode($2->getNumber());
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -310,16 +314,16 @@ number: DEC_NUMBER { $$ = $1; }
|
|||||||
| REAL_NUMBER { $$ = $1; }
|
| REAL_NUMBER { $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
ngon: NGON DEC_NUMBER COMMA number {
|
ngon: NGON DEC_NUMBER COMMA expression {
|
||||||
$$ = new NGonNode($2->getInteger());
|
$$ = new NGonNode($2->getInteger());
|
||||||
$$->addChild(new RadiusNode($4->getNumber()));
|
$$->addChild(new RadiusNode($4->getNumber()));
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
offset: OFFSET number {
|
offset: OFFSET expression {
|
||||||
$$ = new OffsetNode($2->getNumber());
|
$$ = new OffsetNode($2->getNumber());
|
||||||
}
|
}
|
||||||
| OFFSET number LCURLY offset_items RCURLY {
|
| OFFSET expression LCURLY offset_items RCURLY {
|
||||||
$$ = new OffsetNode($2->getNumber());
|
$$ = new OffsetNode($2->getNumber());
|
||||||
$$->addChildren($4);
|
$$->addChildren($4);
|
||||||
}
|
}
|
||||||
@ -333,7 +337,7 @@ offset_items: /* empty */
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
offset_item: SCALE number {
|
offset_item: SCALE expression {
|
||||||
$$ = new ScaleNode(new Vector($2->getNumber(), $2->getNumber(),
|
$$ = new ScaleNode(new Vector($2->getNumber(), $2->getNumber(),
|
||||||
$2->getNumber()));
|
$2->getNumber()));
|
||||||
}
|
}
|
||||||
@ -371,7 +375,7 @@ options_item: WIDTH DEC_NUMBER {
|
|||||||
| MAXDEPTH DEC_NUMBER {
|
| MAXDEPTH DEC_NUMBER {
|
||||||
$$ = new MaxDepthNode($2->getInteger());
|
$$ = new MaxDepthNode($2->getInteger());
|
||||||
}
|
}
|
||||||
| EXPOSURE number {
|
| EXPOSURE expression {
|
||||||
$$ = new ExposureNode($2->getNumber());
|
$$ = new ExposureNode($2->getNumber());
|
||||||
}
|
}
|
||||||
| AMBIENT vector3 {
|
| AMBIENT vector3 {
|
||||||
@ -396,7 +400,7 @@ plane_items: /* empty */
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
plane_item: POSITION vector3 COMMA number {
|
plane_item: POSITION vector3 COMMA expression {
|
||||||
$$ = new PlanePositionNode($2->getVector(), $4->getNumber());
|
$$ = new PlanePositionNode($2->getVector(), $4->getNumber());
|
||||||
}
|
}
|
||||||
| shape_item { $$ = $1; }
|
| shape_item { $$ = $1; }
|
||||||
@ -419,7 +423,7 @@ polygon_items: /* empty */
|
|||||||
polygon_item: vector2 { $$ = $1; }
|
polygon_item: vector2 { $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
radius: RADIUS number {
|
radius: RADIUS expression {
|
||||||
$$ = new RadiusNode($2->getNumber());
|
$$ = new RadiusNode($2->getNumber());
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -508,13 +512,13 @@ subtract: SUBTRACT LCURLY bool_items RCURLY {
|
|||||||
transform: TRANSLATE vector3 {
|
transform: TRANSLATE vector3 {
|
||||||
$$ = new TranslateNode($2->getVector());
|
$$ = new TranslateNode($2->getVector());
|
||||||
}
|
}
|
||||||
| ROTATE number COMMA vector3 {
|
| ROTATE expression COMMA vector3 {
|
||||||
$$ = new RotateNode($2->getNumber(), $4->getVector());
|
$$ = new RotateNode($2->getNumber(), $4->getVector());
|
||||||
}
|
}
|
||||||
| SCALE vector3 {
|
| SCALE vector3 {
|
||||||
$$ = new ScaleNode($2->getVector());
|
$$ = new ScaleNode($2->getVector());
|
||||||
}
|
}
|
||||||
| SCALE number {
|
| SCALE expression {
|
||||||
$$ = new ScaleNode(new Vector($2->getNumber(),
|
$$ = new ScaleNode(new Vector($2->getNumber(),
|
||||||
$2->getNumber(), $2->getNumber()));
|
$2->getNumber(), $2->getNumber()));
|
||||||
}
|
}
|
||||||
@ -524,7 +528,7 @@ transform_block: TRANSLATE vector3 LCURLY transform_block_items RCURLY {
|
|||||||
$$ = new TranslateBlockNode($2->getVector());
|
$$ = new TranslateBlockNode($2->getVector());
|
||||||
$$->addChildren($4);
|
$$->addChildren($4);
|
||||||
}
|
}
|
||||||
| ROTATE number COMMA vector3 LCURLY transform_block_items RCURLY {
|
| ROTATE expression COMMA vector3 LCURLY transform_block_items RCURLY {
|
||||||
$$ = new RotateBlockNode($2->getNumber(), $4->getVector());
|
$$ = new RotateBlockNode($2->getNumber(), $4->getVector());
|
||||||
$$->addChildren($6);
|
$$->addChildren($6);
|
||||||
}
|
}
|
||||||
@ -532,7 +536,7 @@ transform_block: TRANSLATE vector3 LCURLY transform_block_items RCURLY {
|
|||||||
$$ = new ScaleBlockNode($2->getVector());
|
$$ = new ScaleBlockNode($2->getVector());
|
||||||
$$->addChildren($4);
|
$$->addChildren($4);
|
||||||
}
|
}
|
||||||
| SCALE number LCURLY transform_block_items RCURLY {
|
| SCALE expression LCURLY transform_block_items RCURLY {
|
||||||
$$ = new ScaleBlockNode(
|
$$ = new ScaleBlockNode(
|
||||||
new Vector($2->getNumber(), $2->getNumber(),
|
new Vector($2->getNumber(), $2->getNumber(),
|
||||||
$2->getNumber()));
|
$2->getNumber()));
|
||||||
@ -559,20 +563,37 @@ union: UNION LCURLY bool_items RCURLY {
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
vector2: LESS number COMMA number GREATER {
|
vector2: LESS expression COMMA expression GREATER {
|
||||||
refptr<Vector> vec =
|
refptr<Vector> vec =
|
||||||
new Vector($2->getNumber(), $4->getNumber(), 0.0);
|
new Vector($2->getNumber(), $4->getNumber(), 0.0);
|
||||||
$$ = new VectorNode(vec);
|
$$ = new VectorNode(vec);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
vector3: LESS number COMMA number COMMA number GREATER {
|
vector3: LESS expression COMMA expression COMMA expression GREATER {
|
||||||
refptr<Vector> vec =
|
refptr<Vector> vec =
|
||||||
new Vector($2->getNumber(), $4->getNumber(), $6->getNumber());
|
new Vector($2->getNumber(), $4->getNumber(), $6->getNumber());
|
||||||
$$ = new VectorNode(vec);
|
$$ = new VectorNode(vec);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
expression: term { $$ = $1; }
|
||||||
|
| expression TIMES term { $$ = new BinOpNode('*', $1, $3); }
|
||||||
|
| expression DIVIDE term { $$ = new BinOpNode('/', $1, $3); }
|
||||||
|
| MINUS expression %prec UMINUS {
|
||||||
|
$$ = new BinOpNode('-', new NumberNode(0.0), $2);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
term: factor { $$ = $1; }
|
||||||
|
| term PLUS factor { $$ = new BinOpNode('+', $1, $3); }
|
||||||
|
| term MINUS factor { $$ = new BinOpNode('-', $1, $3); }
|
||||||
|
;
|
||||||
|
|
||||||
|
factor: number { $$ = $1; }
|
||||||
|
| LPAREN expression RPAREN { $$ = $2; }
|
||||||
|
;
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
refptr<Node> parse(const char * fileName)
|
refptr<Node> parse(const char * fileName)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user