expression.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. 
  2. #ifndef DSR_BUILDER_EXPRESSION_MODULE
  3. #define DSR_BUILDER_EXPRESSION_MODULE
  4. #include "../../../DFPSR/api/stringAPI.h"
  5. // The expression module is a slow but generic system for evaluating expressions where all data is stored as strings for simplicity.
  6. // No decimal numbers allowed, because it requires both human readable syntax and full determinism without precision loss.
  7. // TODO: Move tokenization from Machine.cpp to expression.cpp
  8. enum Notation {
  9. Prefix = 0,
  10. Infix = 1,
  11. Postfix = 2
  12. };
  13. enum Associativity {
  14. LeftToRight = 0,
  15. RightToLeft = 1
  16. };
  17. struct Operation {
  18. int16_t symbolIndex;
  19. std::function<dsr::String(dsr::ReadableString, dsr::ReadableString)> action;
  20. Operation(int16_t symbolIndex, std::function<dsr::String(dsr::ReadableString, dsr::ReadableString)> action);
  21. };
  22. struct Precedence {
  23. Notation notation;
  24. Associativity associativity;
  25. dsr::List<Operation> operations;
  26. Precedence(Notation notation, Associativity associativity);
  27. };
  28. struct POIndex {
  29. int16_t precedenceIndex = -1;
  30. int16_t operationIndex = -1;
  31. POIndex();
  32. POIndex(int16_t precedenceIndex, int16_t operationIndex);
  33. };
  34. struct Symbol {
  35. dsr::String token;
  36. bool atomic; // Atomic symbols can affect tokenization, the other keywords have to be separated by whitespace or other symbols.
  37. POIndex operations[3]; // prefix, infix and postfix
  38. int32_t depthOffset;
  39. Symbol(const dsr::ReadableString &token, bool atomic, int32_t depthOffset = 0);
  40. };
  41. struct ExpressionSyntax {
  42. dsr::List<Symbol> symbols;
  43. dsr::List<Precedence> precedences;
  44. ExpressionSyntax();
  45. };
  46. dsr::String expression_unwrapIfNeeded(const dsr::ReadableString &text);
  47. dsr::ReadableString expression_getToken(const dsr::List<dsr::String> &tokens, int64_t index);
  48. int64_t expression_interpretAsInteger(const dsr::ReadableString &value);
  49. dsr::String expression_evaluate(const dsr::List<dsr::String> &tokens, std::function<dsr::String(dsr::ReadableString)> identifierEvaluation);
  50. dsr::String expression_evaluate(const dsr::List<dsr::String> &tokens, int64_t startTokenIndex, int64_t endTokenIndex, std::function<dsr::String(dsr::ReadableString)> identifierEvaluation);
  51. dsr::String expression_evaluate(const dsr::List<dsr::String> &tokens, int64_t startTokenIndex, int64_t endTokenIndex, const ExpressionSyntax &syntax, std::function<dsr::String(dsr::ReadableString)> identifierEvaluation);
  52. void expression_runRegressionTests();
  53. #endif