expr.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from . import serial
  2. class Op:
  3. NULL = 0
  4. ADD = 1
  5. SUB = 2
  6. MUL = 3
  7. DIV = 4
  8. CONST_BOOL = 5
  9. CONST_UINT_32 = 6
  10. CONST_FLOAT_32 = 7
  11. CONST_STR = 8
  12. LOAD_VAR = 9
  13. MIN = 11
  14. MAX = 12
  15. IS_EQUAL = 13
  16. LESS_THAN = 14
  17. FLOAT32_TO_UINT32 = 15
  18. @staticmethod
  19. def from_str(op):
  20. match op:
  21. case "null":
  22. return Op.NULL
  23. case "+":
  24. return Op.ADD
  25. case "-":
  26. return Op.SUB
  27. case "*":
  28. return Op.MUL
  29. case "/":
  30. return Op.DIV
  31. case "bool":
  32. return Op.CONST_BOOL
  33. case "u32":
  34. return Op.CONST_UINT_32
  35. case "f32":
  36. return Op.CONST_FLOAT_32
  37. case "str":
  38. return Op.CONST_STR
  39. case "load":
  40. return Op.LOAD_VAR
  41. case "min":
  42. return Op.MIN
  43. case "max":
  44. return Op.MAX
  45. case "==":
  46. return Op.IS_EQUAL
  47. case "<":
  48. return Op.LESS_THAN
  49. case "as_u32":
  50. return Op.FLOAT32_TO_UINT32
  51. def encode_expr(by, code):
  52. op, args = code[0], code[1:]
  53. op = Op.from_str(op)
  54. serial.write_u8(by, op)
  55. match op:
  56. case Op.CONST_BOOL:
  57. serial.write_u8(by, int(args[0]))
  58. case Op.CONST_UINT_32:
  59. serial.write_u32(by, args[0])
  60. case Op.CONST_FLOAT_32:
  61. serial.write_f32(by, args[0])
  62. case Op.CONST_STR:
  63. serial.encode_str(by, args[0])
  64. case Op.LOAD_VAR:
  65. serial.encode_str(by, args[0])
  66. case _:
  67. for arg in args:
  68. encode_expr(by, arg)
  69. # python -m pydrk.expr
  70. if __name__ == "__main__":
  71. code = ["+",
  72. ["u32", 5],
  73. ["/",
  74. ["load", "sw"],
  75. ["u32", 2]
  76. ]
  77. ]
  78. code_s = bytearray()
  79. encode_expr(code_s, code)
  80. assert code_s == bytearray(
  81. [1, 6, 5, 0, 0, 0, 4, 9, 2, 115, 119, 6, 2, 0, 0, 0]
  82. )