inductive Dyck : Type where | round : Dyck → Dyck -- ( ) | curly : Dyck → Dyck -- { } | leaf : Dyck -- declare Dyck grammar parse trees declare_syntax_cat brack syntax "(" brack ")" : brack syntax "{" brack "}" : brack syntax "end" : brack -- notation for translating `brack` into `term` syntax "`[Dyck| " brack "]" : term -- rules to translate Dyck grammar into inductive value of type Dyck macro_rules | `(`[Dyck| end]) => `(Dyck.leaf) | `(`[Dyck| ($b)]) => `(Dyck.round `[Dyck| $b]) -- recurse | `(`[Dyck| {$b}]) => `(Dyck.curly `[Dyck| $b]) -- recurse -- tests #check `[Dyck| end] -- Dyck.leaf #check `[Dyck| {(end)}] -- Dyck.curl (Dyck.round Dyck.leaf)