diff --git a/parser/parser.yy b/parser/parser.yy index 65e0afd..ab8c97c 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -11,6 +11,7 @@ extern "C" { } extern FILE * yyin; +extern char * yytext; void yyerror(const char * str) { @@ -135,8 +136,16 @@ material_item: COLOR vector | SHININESS number ; -number: DEC_NUMBER - | REAL_NUMBER +number: DEC_NUMBER { + double * ptr = new double; + *ptr = atoi(yytext); + $$.ptr = ptr; + } + | REAL_NUMBER { + double * ptr = new double; + *ptr = atof(yytext); + $$.ptr = ptr; + } ; plane: PLANE LCURLY plane_items RCURLY @@ -182,7 +191,16 @@ subtract: SUBTRACT LCURLY boolean_items RCURLY union: UNION LCURLY boolean_items RCURLY ; -vector: LESS number COMMA number COMMA number GREATER +vector: LESS number COMMA number COMMA number GREATER { + Vector * ptr = new Vector(); + (*ptr)[0] = * (double *) $2.ptr; + (*ptr)[1] = * (double *) $4.ptr; + (*ptr)[2] = * (double *) $6.ptr; + $$.ptr = ptr; + delete (double *) $2.ptr; + delete (double *) $4.ptr; + delete (double *) $6.ptr; + } ; %% diff --git a/util/refptr.cc b/util/refptr.cc new file mode 100644 index 0000000..e02f1cc --- /dev/null +++ b/util/refptr.cc @@ -0,0 +1,27 @@ + +#include "refptr.h" + +template refptr::refptr(const T * ptr) +{ + m_ptr = ptr; + refCount = new int; + *refCount = 1; +} + +template refptr::refptr(const refptr & orig) +{ + cloneFrom(orig); +} + +template refptr & refptr::operator=(const refptr & orig) +{ + cloneFrom(orig); + return *this; +} + +template void refptr::cloneFrom(const refptr & orig) +{ + this->ptr = orig.ptr; + this->refCount = orig.refCount; + (*refCount)++; +} diff --git a/util/refptr.h b/util/refptr.h new file mode 100644 index 0000000..0f4b96f --- /dev/null +++ b/util/refptr.h @@ -0,0 +1,21 @@ + +#ifndef REFPTR_H +#define REFPTR_H REFPTR_H + +template +class refptr +{ + public: + refptr(const T * ptr); + refptr(const refptr & orig); + refptr & operator=(const refptr & orig); + + private: + void cloneFrom(const refptr & orig); + + T * m_ptr; + int * refCount; +}; + +#endif +