parser.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:8k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // parser.cpp
  2. //
  3. // Copyright (C) 2001 Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include "parser.h"
  10. /****** Value method implementations *******/
  11. Value::Value(double d)
  12. {
  13.     type = NumberType;
  14.     data.d = d;
  15. }
  16. Value::Value(string s)
  17. {
  18.     type = StringType;
  19.     data.s = new string(s);
  20. }
  21. Value::Value(Array* a)
  22. {
  23.     type = ArrayType;
  24.     data.a = a;
  25. }
  26. Value::Value(Hash* h)
  27. {
  28.     type = HashType;
  29.     data.h = h;
  30. }
  31. Value::Value(bool b)
  32. {
  33.     type = BooleanType;
  34.     data.d = b ? 1.0 : 0.0;
  35. }
  36. Value::~Value()
  37. {
  38.     if (type == StringType)
  39.     {
  40.         delete data.s;
  41.     }
  42.     else if (type == ArrayType)
  43.     {
  44.         if (data.a != NULL)
  45.         {
  46.             for (unsigned int i = 0; i < data.a->size(); i++)
  47.                 delete (*data.a)[i];
  48.             delete data.a;
  49.         }
  50.     }
  51.     else if (type == HashType)
  52.     {
  53.         if (data.h != NULL)
  54.         {
  55. #if 0
  56.             Hash::iterator iter = data.h->begin();
  57.             while (iter != data.h->end())
  58.             {
  59.                 delete iter->second;
  60.                 iter++;
  61.             }
  62. #endif
  63.             delete data.h;
  64.         }
  65.     }
  66. }
  67. Value::ValueType Value::getType() const
  68. {
  69.     return type;
  70. }
  71. double Value::getNumber() const
  72. {
  73.     // ASSERT(type == NumberType);
  74.     return data.d;
  75. }
  76. string Value::getString() const
  77. {
  78.     // ASSERT(type == StringType);
  79.     return *data.s;
  80. }
  81. Array* Value::getArray() const
  82. {
  83.     // ASSERT(type == ArrayType);
  84.     return data.a;
  85. }
  86. Hash* Value::getHash() const
  87. {
  88.     // ASSERT(type == HashType);
  89.     return data.h;
  90. }
  91. bool Value::getBoolean() const
  92. {
  93.     // ASSERT(type == BooleanType);
  94.     return (data.d != 0.0);
  95. }
  96. /****** Parser method implementation ******/
  97. Parser::Parser(Tokenizer* _tokenizer) :
  98.     tokenizer(_tokenizer)
  99. {
  100. }
  101. Array* Parser::readArray()
  102. {
  103.     Tokenizer::TokenType tok = tokenizer->nextToken();
  104.     if (tok != Tokenizer::TokenBeginArray)
  105.     {
  106.         tokenizer->pushBack();
  107.         return NULL;
  108.     }
  109.     Array* array = new Array();
  110.     Value* v = readValue();
  111.     while (v != NULL)
  112.     {
  113.         array->insert(array->end(), v);
  114.         v = readValue();
  115.     }
  116.     
  117.     tok = tokenizer->nextToken();
  118.     if (tok != Tokenizer::TokenEndArray)
  119.     {
  120.         tokenizer->pushBack();
  121.         delete array;
  122.         return NULL;
  123.     }
  124.     return array;
  125. }
  126. Hash* Parser::readHash()
  127. {
  128.     Tokenizer::TokenType tok = tokenizer->nextToken();
  129.     if (tok != Tokenizer::TokenBeginGroup)
  130.     {
  131.         tokenizer->pushBack();
  132.         return NULL;
  133.     }
  134.     Hash* hash = new Hash();
  135.     tok = tokenizer->nextToken();
  136.     while (tok != Tokenizer::TokenEndGroup)
  137.     {
  138.         if (tok != Tokenizer::TokenName)
  139.         {
  140.             tokenizer->pushBack();
  141.             delete hash;
  142.             return NULL;
  143.         }
  144.         string name = tokenizer->getNameValue();
  145.         Value* value = readValue();
  146.         if (value == NULL)
  147.         {
  148.             delete hash;
  149.             return NULL;
  150.         }
  151.         
  152.         hash->addValue(name, *value);
  153.         tok = tokenizer->nextToken();
  154.     }
  155.     return hash;
  156. }
  157. Value* Parser::readValue()
  158. {
  159.     Tokenizer::TokenType tok = tokenizer->nextToken();
  160.     switch (tok)
  161.     {
  162.     case Tokenizer::TokenNumber:
  163.         return new Value(tokenizer->getNumberValue());
  164.     case Tokenizer::TokenString:
  165.         return new Value(tokenizer->getStringValue());
  166.     case Tokenizer::TokenName:
  167.         if (tokenizer->getNameValue() == "false")
  168.             return new Value(false);
  169.         else if (tokenizer->getNameValue() == "true")
  170.             return new Value(true);
  171.         else
  172.         {
  173.             tokenizer->pushBack();
  174.             return NULL;
  175.         }
  176.     case Tokenizer::TokenBeginArray:
  177.         tokenizer->pushBack();
  178.         {
  179.             Array* array = readArray();
  180.             if (array == NULL)
  181.                 return NULL;
  182.             else
  183.                 return new Value(array);
  184.         }
  185.     case Tokenizer::TokenBeginGroup:
  186.         tokenizer->pushBack();
  187.         {
  188.             Hash* hash = readHash();
  189.             if (hash == NULL)
  190.                 return NULL;
  191.             else
  192.                 return new Value(hash);
  193.         }
  194.     default:
  195.         tokenizer->pushBack();
  196.         return NULL;
  197.     }
  198. }
  199. AssociativeArray::AssociativeArray()
  200. {
  201. }
  202. AssociativeArray::~AssociativeArray()
  203. {
  204. #if 0
  205.     Hash::iterator iter = data.h->begin();
  206.     while (iter != data.h->end())
  207.     {
  208.         delete iter->second;
  209.         iter++;
  210.     }
  211. #endif
  212.     for (map<string, Value*>::iterator iter = assoc.begin(); iter != assoc.end(); iter++)
  213.         delete iter->second;
  214. }
  215. Value* AssociativeArray::getValue(string key) const
  216. {
  217.     map<string, Value*>::const_iterator iter = assoc.find(key);
  218.     if (iter == assoc.end())
  219.         return NULL;
  220.     else
  221.         return iter->second;
  222. }
  223. void AssociativeArray::addValue(string key, Value& val)
  224. {
  225.     assoc.insert(map<string, Value*>::value_type(key, &val));
  226. }
  227. bool AssociativeArray::getNumber(const string& key, double& val) const
  228. {
  229.     Value* v = getValue(key);
  230.     if (v == NULL || v->getType() != Value::NumberType)
  231.         return false;
  232.     val = v->getNumber();
  233.     return true;
  234. }
  235. bool AssociativeArray::getNumber(const string& key, float& val) const
  236. {
  237.     double dval;
  238.     if (!getNumber(key, dval))
  239.     {
  240.         return false;
  241.     }
  242.     else
  243.     {
  244.         val = (float) dval;
  245.         return true;
  246.     }
  247. }
  248. bool AssociativeArray::getNumber(const string& key, int& val) const
  249. {
  250.     double ival;
  251.     if (!getNumber(key, ival))
  252.     {
  253.         return false;
  254.     }
  255.     else
  256.     {
  257.         val = (int) ival;
  258.         return true;
  259.     }
  260. }
  261. bool AssociativeArray::getNumber(const string& key, uint32& val) const
  262. {
  263.     double ival;
  264.     if (!getNumber(key, ival))
  265.     {
  266.         return false;
  267.     }
  268.     else
  269.     {
  270.         val = (uint32) ival;
  271.         return true;
  272.     }
  273. }
  274. bool AssociativeArray::getString(const string& key, string& val) const
  275. {
  276.     Value* v = getValue(key);
  277.     if (v == NULL || v->getType() != Value::StringType)
  278.         return false;
  279.     val = v->getString();
  280.     return true;
  281. }
  282. bool AssociativeArray::getBoolean(const string& key, bool& val) const
  283. {
  284.     Value* v = getValue(key);
  285.     if (v == NULL || v->getType() != Value::BooleanType)
  286.         return false;
  287.     val = v->getBoolean();
  288.     return true;
  289. }
  290. bool AssociativeArray::getVector(const string& key, Vec3d& val) const
  291. {
  292.     Value* v = getValue(key);
  293.     if (v == NULL || v->getType() != Value::ArrayType)
  294.         return false;
  295.     Array* arr = v->getArray();
  296.     if (arr->size() != 3)
  297.         return false;
  298.     Value* x = (*arr)[0];
  299.     Value* y = (*arr)[1];
  300.     Value* z = (*arr)[2];
  301.     if (x->getType() != Value::NumberType ||
  302.         y->getType() != Value::NumberType ||
  303.         z->getType() != Value::NumberType)
  304.         return false;
  305.     val = Vec3d(x->getNumber(), y->getNumber(), z->getNumber());
  306.     return true;
  307. }
  308. bool AssociativeArray::getVector(const string& key, Vec3f& val) const
  309. {
  310.     Vec3d vecVal;
  311.     if (!getVector(key, vecVal))
  312.         return false;
  313.     val = Vec3f((float) vecVal.x, (float) vecVal.y, (float) vecVal.z);
  314.     return true;
  315. }
  316. bool AssociativeArray::getRotation(const string& key, Quatf& val) const
  317. {
  318.     Value* v = getValue(key);
  319.     if (v == NULL || v->getType() != Value::ArrayType)
  320.         return false;
  321.     Array* arr = v->getArray();
  322.     if (arr->size() != 4)
  323.         return false;
  324.     Value* w = (*arr)[0];
  325.     Value* x = (*arr)[1];
  326.     Value* y = (*arr)[2];
  327.     Value* z = (*arr)[3];
  328.     if (w->getType() != Value::NumberType ||
  329.         x->getType() != Value::NumberType ||
  330.         y->getType() != Value::NumberType ||
  331.         z->getType() != Value::NumberType)
  332.         return false;
  333.     Vec3f axis((float) x->getNumber(),
  334.                (float) y->getNumber(),
  335.                (float) z->getNumber());
  336.     axis.normalize();
  337.     float angle = degToRad((float) w->getNumber());
  338.     val.setAxisAngle(axis, angle);
  339.     return true;
  340. }
  341. bool AssociativeArray::getColor(const string& key, Color& val) const
  342. {
  343.     Vec3d vecVal;
  344.     if (!getVector(key, vecVal))
  345.         return false;
  346.     val = Color((float) vecVal.x, (float) vecVal.y, (float) vecVal.z);
  347.     return true;
  348. }
  349. HashIterator
  350. AssociativeArray::begin()
  351. {
  352.     return assoc.begin();
  353. }
  354. HashIterator
  355. AssociativeArray::end()
  356. {
  357.     return assoc.end();
  358. }