| #pragma once |
| |
| #ifndef TGRAMMAR_INCLUDED |
| #define TGRAMMAR_INCLUDED |
| |
| #include <memory> |
| |
| |
| #include "tcommon.h" |
| |
| |
| #include "ttokenizer.h" |
| |
| #undef DVAPI |
| #undef DVVAR |
| #ifdef TNZBASE_EXPORTS |
| #define DVAPI DV_EXPORT_API |
| #define DVVAR DV_EXPORT_VAR |
| #else |
| #define DVAPI DV_IMPORT_API |
| #define DVVAR DV_IMPORT_VAR |
| #endif |
| |
| |
| |
| |
| |
| class TDoubleParam; |
| class TUnit; |
| |
| namespace TSyntax { |
| class Token; |
| class Calculator; |
| } |
| |
| |
| |
| |
| |
| |
| |
| namespace TSyntax { |
| |
| class DVAPI CalculatorNodeVisitor { |
| public: |
| CalculatorNodeVisitor() {} |
| virtual ~CalculatorNodeVisitor() {} |
| }; |
| |
| |
| |
| class DVAPI CalculatorNode { |
| Calculator *m_calculator; |
| |
| public: |
| CalculatorNode(Calculator *calculator) : m_calculator(calculator) {} |
| virtual ~CalculatorNode() {} |
| |
| Calculator *getCalculator() const { return m_calculator; } |
| |
| enum { T, FRAME, RFRAME }; |
| virtual double compute(double vars[3]) const = 0; |
| |
| virtual void accept(CalculatorNodeVisitor &visitor) = 0; |
| |
| private: |
| |
| CalculatorNode(const CalculatorNode &); |
| CalculatorNode &operator=(const CalculatorNode &); |
| }; |
| |
| |
| |
| class DVAPI Calculator { |
| CalculatorNode *m_rootNode; |
| |
| TDoubleParam *m_param; |
| const TUnit *m_unit; |
| |
| public: |
| Calculator(); |
| virtual ~Calculator(); |
| |
| void setRootNode(CalculatorNode *node); |
| |
| double compute(double t, double frame, double rframe) { |
| double vars[3]; |
| vars[0] = t, vars[1] = frame, vars[2] = rframe; |
| return m_rootNode->compute(vars); |
| } |
| |
| void accept(CalculatorNodeVisitor &visitor) { m_rootNode->accept(visitor); } |
| |
| typedef double Calculator::*Variable; |
| |
| void setOwnerParameter(TDoubleParam *param) { m_param = param; } |
| TDoubleParam *getOwnerParameter() const { return m_param; } |
| |
| const TUnit *getUnit() const { return m_unit; } |
| void setUnit(const TUnit *unit) { m_unit = unit; } |
| |
| private: |
| |
| Calculator(const Calculator &); |
| Calculator &operator=(const Calculator &); |
| }; |
| |
| |
| |
| class DVAPI NumberNode final : public CalculatorNode { |
| double m_value; |
| |
| public: |
| NumberNode(Calculator *calc, double value) |
| : CalculatorNode(calc), m_value(value) {} |
| |
| double compute(double vars[3]) const override { return m_value; } |
| |
| void accept(CalculatorNodeVisitor &visitor) override {} |
| }; |
| |
| |
| |
| class DVAPI VariableNode final : public CalculatorNode { |
| int m_varIdx; |
| |
| public: |
| VariableNode(Calculator *calc, int varIdx) |
| : CalculatorNode(calc), m_varIdx(varIdx) {} |
| |
| double compute(double vars[3]) const override { return vars[m_varIdx]; } |
| |
| void accept(CalculatorNodeVisitor &visitor) override {} |
| }; |
| |
| |
| |
| |
| |
| enum TokenType { |
| Unknown = 0, |
| |
| Number, |
| Constant, |
| Variable, |
| Operator, |
| Parenthesis, |
| Function, |
| Comma, |
| |
| UnexpectedToken = -100, |
| Eos, |
| Mismatch, |
| |
| InternalError = -200 |
| }; |
| |
| |
| |
| class DVAPI Pattern { |
| std::string m_description; |
| |
| public: |
| Pattern() {} |
| virtual ~Pattern() {} |
| |
| virtual std::string getFirstKeyword() const { return ""; } |
| virtual void getAcceptableKeywords(std::vector<std::string> &keywords) const { |
| } |
| virtual int getPriority() const { return 0; } |
| virtual bool expressionExpected( |
| const std::vector<Token> &previousTokens) const { |
| return false; |
| } |
| virtual bool matchToken(const std::vector<Token> &previousTokens, |
| const Token &token) const = 0; |
| virtual bool isFinished(const std::vector<Token> &previousTokens, |
| const Token &token) const = 0; |
| virtual bool isComplete(const std::vector<Token> &previousTokens, |
| const Token &token) const { |
| return isFinished(previousTokens, token); |
| } |
| virtual TokenType getTokenType( |
| const std::vector<Token> &previousTokens, |
| const Token &token) const = 0; |
| |
| virtual void createNode(Calculator *calc, |
| std::vector<CalculatorNode *> &stack, |
| const std::vector<Token> &tokens) const = 0; |
| |
| std::string getDescription() const { return m_description; } |
| void setDescription(std::string description) { m_description = description; } |
| |
| |
| CalculatorNode *popNode(std::vector<CalculatorNode *> &stack) const; |
| }; |
| |
| |
| |
| class DVAPI Grammar { |
| class Imp; |
| std::unique_ptr<Imp> m_imp; |
| |
| public: |
| Grammar(); |
| ~Grammar(); |
| |
| void addPattern(Pattern *pattern); |
| |
| enum Position { ExpressionStart, ExpressionEnd }; |
| |
| |
| const Pattern *getPattern(Position position, const Token &token) const; |
| |
| |
| typedef std::vector<std::pair<std::string, std::string>> Suggestions; |
| void getSuggestions(Suggestions &suggetsions, Position position) const; |
| |
| private: |
| |
| Grammar(const Grammar &); |
| Grammar &operator=(const Grammar &); |
| }; |
| |
| } |
| |
| #endif |