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[])