-class Parser {
-public:
- void addParser(const std::string& name, exp_parser parser)
- {
- _parserTable.insert(std::make_pair(name, parser));
- }
- Expression* read(const SGPropertyNode* exp)
- {
- ParserMap::iterator itr = _parserTable.find(exp->getName());
- if (itr == _parserTable.end())
- throw ParseError(string("unknown expression ") + exp->getName());
- exp_parser parser = itr->second;
- return (*parser)(exp, this);
- }
- // XXX vector of SGSharedPtr?
- bool readChildren(const SGPropertyNode* exp,
- vector<Expression*>& result);
-protected:
- typedef std::map<const std::string, exp_parser> ParserMap;
- ParserMap _parserTable;
-};
-
-class ExpressionParser : public Parser, public Singleton<ExpressionParser>
-{
-};
-
-void addExpParser(const string& token, exp_parser parsefn)
-{
- ExpressionParser::instance()->addParser(token, parsefn);
-}
-
-Expression* read(const SGPropertyNode* exp, Parser* parser)
-{
- if (!parser)
- parser = ExpressionParser::instance();
- return parser->read(exp);
-}
-