ast.rs 922 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. type Name = String;
  2. #[derive(Debug, Clone)]
  3. pub enum Stmt {
  4. Puts(Expr),
  5. Fix(Name),
  6. Assn(Name, Expr),
  7. LitAssn(Name, Vec<String>),
  8. }
  9. #[derive(Debug, Clone)]
  10. pub enum Expr {
  11. Var(Name),
  12. Cat(Vec<Expr>),
  13. Chc(Vec<Choice>),
  14. Rep(i64, Box<Expr>),
  15. Lit(Literal),
  16. Ap(Box<Expr>, Box<Expr>),
  17. Tup(Vec<Expr>),
  18. Let(Name, Box<Expr>, Box<Expr>),
  19. Fun(Vec<Case>),
  20. Case(Box<Expr>, Vec<Case>),
  21. Range(Box<Expr>, Box<Expr>),
  22. }
  23. #[derive(Debug, Clone)]
  24. pub struct Case {
  25. pub pat: Pat,
  26. pub expr: Expr,
  27. }
  28. #[derive(Debug, Clone)]
  29. pub enum Pat {
  30. Var(Name),
  31. Lit(Literal),
  32. Tup(Vec<Pat>),
  33. }
  34. #[derive(Debug, Clone)]
  35. pub struct Choice {
  36. pub weight: Option<i64>,
  37. pub value: Expr,
  38. }
  39. impl Choice {
  40. pub fn weight(&self) -> i64 {
  41. self.weight.unwrap_or(1)
  42. }
  43. }
  44. #[derive(Debug, Clone)]
  45. pub enum Literal {
  46. Str(String),
  47. Atom(String),
  48. Num(i64),
  49. }