ast.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. use indexmap::IndexMap;
  2. use super::{lexer::Token, opcode::Opcode, types::Type};
  3. #[derive(Copy, PartialEq, Clone, Debug)]
  4. #[repr(u8)]
  5. pub enum StatementType {
  6. Assignment = 0x00,
  7. Call = 0x01,
  8. Noop = 0xff,
  9. }
  10. pub enum Var {
  11. Constant(Constant),
  12. Witness(Witness),
  13. Variable(Variable),
  14. }
  15. #[derive(Clone, Debug)]
  16. pub struct Variable {
  17. pub name: String,
  18. pub typ: Type,
  19. pub line: usize,
  20. pub column: usize,
  21. }
  22. #[derive(Clone, Debug)]
  23. pub struct Statement {
  24. pub typ: StatementType,
  25. pub variable: Option<Variable>,
  26. pub opcode: Opcode,
  27. pub args: Vec<Variable>,
  28. pub line: usize,
  29. }
  30. impl Default for Statement {
  31. fn default() -> Self {
  32. Statement {
  33. typ: StatementType::Noop,
  34. variable: None,
  35. opcode: Opcode::Noop,
  36. args: vec![],
  37. line: 0,
  38. }
  39. }
  40. }
  41. pub type UnparsedConstants = IndexMap<String, (Token, Token)>;
  42. pub type UnparsedWitnesses = IndexMap<String, (Token, Token)>;
  43. pub type Constants = Vec<Constant>;
  44. pub type Witnesses = Vec<Witness>;
  45. pub type Variables = Vec<Variable>;
  46. pub type Statements = Vec<Statement>;
  47. #[derive(Clone, Debug)]
  48. pub struct Constant {
  49. pub name: String,
  50. pub typ: Type,
  51. pub line: usize,
  52. pub column: usize,
  53. }
  54. #[derive(Clone, Debug)]
  55. pub struct Witness {
  56. pub name: String,
  57. pub typ: Type,
  58. pub line: usize,
  59. pub column: usize,
  60. }