diff --git a/parser/nodes.h b/parser/nodes.h index f23e516..e0dc89b 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -101,6 +101,22 @@ class PlaneNode : public Node { }; +class PlanePositionNode : public Node +{ + public: + PlanePositionNode(refptr vec, double dist) + { + m_vector = vec; + m_dist = dist; + } + refptr getVector() { return m_vector; } + double getNumber() { return m_dist; } + + protected: + refptr m_vector; + double m_dist; +}; + class PositionNode : public Node { }; diff --git a/parser/parser.yy b/parser/parser.yy index 5c82b0d..ba8dda6 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -226,15 +226,22 @@ options_item: WIDTH DEC_NUMBER { plane: PLANE LCURLY plane_items RCURLY { $$ = new PlaneNode(); + $$->addChildren($3); } ; -plane_items: plane_item plane_items - | shape_item plane_items +plane_items: /* empty */ + | plane_item plane_items { + $$ = new ItemsNode(); + $$->addChild($1); + $$->addChildren($2); + } ; -plane_item: POSITION vector COMMA number - | shape_item +plane_item: POSITION vector COMMA number { + $$ = new PlanePositionNode($2->getVector(), $4->getNumber()); + } + | shape_item { $$ = $1; } ; radius: RADIUS number { @@ -272,8 +279,7 @@ shape_items: /* empty */ } ; -shape_item: - | material { $$ = $1; } +shape_item: material { $$ = $1; } ; sphere: SPHERE LCURLY sphere_items RCURLY { @@ -288,11 +294,6 @@ sphere_items: /* empty */ $$->addChild($1); $$->addChildren($2); } - | shape_item sphere_items { - $$ = new ItemsNode(); - $$->addChild($1); - $$->addChildren($2); - } ; sphere_item: radius { $$ = $1; } @@ -306,11 +307,11 @@ 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(); - $$ = new VectorNode(vector); + refptr vec = new Vector(); + (*vec)[0] = $2->getNumber(); + (*vec)[1] = $4->getNumber(); + (*vec)[2] = $6->getNumber(); + $$ = new VectorNode(vec); } ;