Eu já desenvolvi vários compiladores usando c++ e digo que não é dificil, provavelmente porque já tou calejado em usar flex e bison.
Java não te compra muito na questão das estruturas de dados que você precisa em um compilador.
Pessoalmente eu não gosto dos formatos utilizados pelas ferramentas java dessa area, me referindo ao ANTLR e o javacc.
Tirando isso, escrever lexical scanners e parser na mão não é uma tarefa dificil se você conhecer como fazer isso, e sua gramática poder ser lida usando LA1/recursivo descendente.
Usar java ou c++ não vai fazer diferença caso você ainda não possua alguma experiência com scanner/parser/ast generators. Para escrever tudo na mão Java vai ser mais produtivo devido a classes como StreamTokenizer.
Porêm se sua gramática for pequena/média, nada vai bater em termos de produtividade a seguinte biblioteca: http://spirit.sourceforge.net/
PS: tenho um exemplo em C de 1 compilador para uma gramática trivial que gera código assembly para pcs, a gramática em ebnf:
identifier ::= ('a'-'z')+
number ::= ('0'-'9')+
expressao ::= identifer '=' identifier (('+' | '-') identifier)* ';'
programa ::= ('int' identifier `;')+
(identifier '=' number ';')*
('faca' [identifier 'vezes'] '{' expressao+ '}' )*
São 432 linhas de código no total. Se quiser só dar 1 toque.