Ejemplo de reconocedor de llaves balanceadas, con árbol de parsing. /*Opciones de Personalización*/ options { LOOKAHEAD = 1; CHOICE_AMBIGUITY_CHECK = 2; OTHER_AMBIGUITY_CHECK = 1; STATIC = true; DEBUG_PARSER = false; DEBUG_LOOKAHEAD = false; DEBUG_TOKEN_MANAGER = false; ERROR_REPORTING = true; JAVA_UNICODE_ESCAPE = false; UNICODE_INPUT = false; IGNORE_CASE = false; USER_TOKEN_MANAGER = false; USER_CHAR_STREAM = false; BUILD_PARSER = true; BUILD_TOKEN_MANAGER = true; SANITY_CHECK = true; FORCE_LA_CHECK = false; } PARSER_BEGIN(Simplejjt) public class Simplejjt { public static void main(String args[]) { System.out.println("Leyendo del input standard..."); Simplejjt t = new Simplejjt(System.in); try { SimpleNode n = t.Start(); n.dump(">"); System.out.println("Muchas Gracias."); } catch (Exception e) { System.out.println("Oops."); System.out.println(e.getMessage()); e.printStackTrace(); } } } PARSER_END(Simplejjt) /*secuencias SKIP*/ SKIP : { " " | "\t" | "\n" | "\r" } /*secuencias TOKEN*/ TOKEN : { | } /* Métodos correspondientes a las reglas de producción*/ SimpleNode Start() : { int cont; } { cont=LlavesBalanceadas() { System.out.println("El nivel de anidamiento es " + cont); } ";" {return jjtThis;} } int LlavesBalanceadas() : { int contanid=0; } { LlaveApertura() [ contanid=LlavesBalanceadas() ] LlaveCierre() { return ++contanid; } } void LlaveApertura(): {} { } void LlaveCierre(): {} { }