11 #ifndef hifi_AnimExpression
12 #define hifi_AnimExpression
15 #include <glm/glm.hpp>
16 #include <glm/gtc/quaternion.hpp>
19 #include "AnimVariant.h"
21 class AnimExpression {
23 friend class AnimTests;
24 explicit AnimExpression(
const QString& str);
52 explicit Token(Type type) : type {type} {}
53 explicit Token(
const QStringRef& strRef) : type {Type::Identifier}, strVal {strRef.toString()} {}
54 explicit Token(
int val) : type {Type::Int}, intVal {val} {}
55 explicit Token(
bool val) : type {Type::Bool}, intVal {val} {}
56 explicit Token(
float val) : type {Type::Float}, floatVal {val} {}
60 float floatVal {0.0f};
85 explicit OpCode(Type type) : type {type} {}
86 explicit OpCode(
const QStringRef& strRef) : type {Type::Identifier}, strVal {strRef.toString()} {}
87 explicit OpCode(
const QString& str) : type {Type::Identifier}, strVal {str} {}
88 explicit OpCode(
int val) : type {Type::Int}, intVal {val} {}
89 explicit OpCode(
bool val) : type {Type::Bool}, intVal {(int)val} {}
90 explicit OpCode(
float val) : type {Type::Float}, floatVal {val} {}
92 bool coerceBool(
const AnimVariantMap& map)
const {
93 if (type == Int || type == Bool) {
95 }
else if (type == Identifier) {
96 return map.lookup(strVal,
false);
105 float floatVal {0.0f};
108 void unconsumeToken(
const Token& token);
109 Token consumeToken(
const QString& str, QString::const_iterator& iter)
const;
110 Token consumeIdentifier(
const QString& str, QString::const_iterator& iter)
const;
111 Token consumeNumber(
const QString& str, QString::const_iterator& iter)
const;
112 Token consumeAnd(
const QString& str, QString::const_iterator& iter)
const;
113 Token consumeOr(
const QString& str, QString::const_iterator& iter)
const;
114 Token consumeGreaterThan(
const QString& str, QString::const_iterator& iter)
const;
115 Token consumeLessThan(
const QString& str, QString::const_iterator& iter)
const;
116 Token consumeNot(
const QString& str, QString::const_iterator& iter)
const;
118 bool parseExpr(
const QString& str, QString::const_iterator& iter);
119 bool parseExprPrime(
const QString& str, QString::const_iterator& iter);
120 bool parseTerm(
const QString& str, QString::const_iterator& iter);
121 bool parseTermPrime(
const QString& str, QString::const_iterator& iter);
122 bool parseUnary(
const QString& str, QString::const_iterator& iter);
123 bool parseFactor(
const QString& str, QString::const_iterator& iter);
125 OpCode evaluate(
const AnimVariantMap& map)
const;
126 void evalAnd(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
127 void evalOr(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
128 void evalGreaterThan(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
129 void evalGreaterThanEqual(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
130 void evalLessThan(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
131 void evalLessThanEqual(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
132 void evalEqual(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
133 void evalNotEqual(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
134 void evalNot(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
135 void evalSubtract(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
136 void evalAdd(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
137 void add(
int lhs,
const OpCode& rhs, std::stack<OpCode>& stack)
const;
138 void add(
float lhs,
const OpCode& rhs, std::stack<OpCode>& stack)
const;
139 void evalMultiply(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
140 void mul(
int lhs,
const OpCode& rhs, std::stack<OpCode>& stack)
const;
141 void mul(
float lhs,
const OpCode& rhs, std::stack<OpCode>& stack)
const;
142 void evalDivide(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
143 void evalModulus(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
144 void evalUnaryMinus(
const AnimVariantMap& map, std::stack<OpCode>& stack)
const;
146 OpCode coerseToValue(
const AnimVariantMap& map,
const OpCode& opCode)
const;
149 mutable std::stack<Token> _tokenStack;
150 std::vector<OpCode> _opCodes;
153 void dumpOpCodes()
const;