R, 112 107 10399 bytes
Non-recursive approach. We use "<" and ">" because it avoids escape characters in the regex. To allow us to use a shorter specification for an ASCII range, we generate all 2^2n3^2n 2n-character strings of "(""<", "=" and ")"">" using expand.grid
(via their ASCII codes 4060, 61 and 4162) and then grep to see which combinations give balanced parenthesesopen and close brackets. The "=" possibilities will get ignored, of course.
Via http://rachbelaid.com/recursive-regular-experession/
function(n)sort(grep("^(\\(<(?1)*\\)*>)(?1)*$",apply(expand.grid(rep(list(4160:4062),2*n)),1,intToUtf8),,T,T))
Explanation
"^(\\(<(?1)*\\)*>)(?1)*$" = regex for balanced parens<> with no other characters
^ # match a start of the string
( # start of expression 1
\\(< # open parens<>
(?1)* # optional repeat of any number of expression 1 (recursive)
# allows match for parentheses like (()()())(()) where ?1 is (\\((?1)*\\))
\\)> # close parens<>
) # end of expression 1
(?1)* # optional repeat of any number of expression 1
$ # end of string
function(n)
sort(
grep("^(\\(<(?1)*\\)*>)(?1)*$", # search for regular expression matching parensopen and close brackets
apply(
expand.grid(rep(list(4160:4062),2*n)) # generate 2^3^(2n) 4060, 4161,62 combinations
,1,intToUtf8) # turn into all 2^3^(2n) combinations of "(""<",")""=",">"
,,T,T) # return the values that match the regex, so "=" gets ignored
) # sort them
R, 107 bytes
Usual recursive approach.
-1 thanks @Giuseppe
f=function(n,x=0:1)`if`(n,sort(unique(unlist(Map(f,n-1,lapply(seq(x),append,x=x,v=0:1))))),intToUtf8(x+40))