Qwerty AST grammar - gt-tinker/qwerty-rust-ast GitHub Wiki

type ::= FuncType(in_ty: type, out_ty: type)
       | RevFuncType(in_out_ty: type)
       | RegType(elem_ty: reg_kind, dim: uint)
       | UnitType

reg_kind ::= Bit
           | Qubit
           | Basis

expr ::= Variable(name: str)
       | UnitLiteral
       | Adjoint(func: expr)
       | Pipe(lhs: expr, rhs: expr)
       | Measure(b: basis)
       | Discard
       | Tensor(vals: expr[])
       | BasisTranslation(bin: basis, bout: basis)
       | Predicated(then_func: expr, else_func: expr, pred: basis)
       | NonUniformSuperpos(pairs: (double, qlit)[])
       | Conditional(then: expr, else: expr, cond: expr)
       | qlit

qlit ::= ZeroQubit
       | OneQubit
       | QubitTilt(q: qlit)
       | UniformSuperpos(q1: qlit, q2: qlit)
       | QubitTensor(qs: qlit[])

vec ::= ZeroVector
      | OneVector
      | PadVector
      | TargetVector
      | VectorTilt(q: qlit)
      | UniformVectorSuperpos(q1: qlit, q2: qlit)
      | VectorTensor(qs: qlit[])

basis ::= BasisLiteral(vecs: vec[])
        | EmptyBasisLiteral
        | BasisTensor(bases: basis[])

stmt ::= Assign(lhs: str, rhs: expr)
       | UnpackAssign(lhs: str[], rhs: expr)
       | Return(val: expr)

func ::= FunctionDef(name: str, args: (type, str)[], ret_type: type,
                     body: stmt[])

prog ::= Program(funcs: func[])