/ / antlr, ¿cómo arreglar la gramática para (varname)? falla al analizar si existe pero está mal - antlr

antlr, ¿cómo arreglar la gramática para (varname)? falla el análisis si existe pero está equivocado - antlr

Estoy reescribiendo esta publicación (la misma pregunta, menos palabras).

Reescribí mi gramática para tener este nivel superior

statement: SELECT EOF!;
#removed all other rules and tokens and still not working
SELECT  :   ("S"|"s")("E"|"e")("L"|"l")("E"|"e")("C"|"c")("T"|"t");

Luego tengo el siguiente código Java (no hay ningún método de análisis en mi analizador como el que veo en las publicaciones de todos los demás :( :() ...

@Test
public void testGrammar() throws RecognitionException {
String sql = "select p FROM TABLE p left join p.security s where p.numShares = :shares and s.securityType = :type";

ANTLRStringStream stream = new ANTLRStringStream(sql);
NoSqlLexer lexer = new NoSqlLexer(stream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
NoSqlParser parser = new NoSqlParser(tokenStream);

try {
CommonTree tree = (CommonTree) parser.statement().getTree();
Assert.fail("should fail parsing");
} catch(Exception e) {
log.info("Exception", e);
}
}

Debería obtener una excepción en el análisis, pero no: (:(. Esta es una gramática muy simple con un EOF pero no funciona. ¿Alguna idea de por qué? ¿Estoy llamando a la declaración de análisis incorrecta?

NOTA: Estoy tratando de simplificar un problema mucho más grande reduciéndolo a esta simple cosa que parece no funcionar.

archivo gramatical completo (muy pequeño) está aquí

grammar NoSql;


options {
output = AST;
language = Java;
}

tokens {


}

@header {
package com.alvazan.orm.parser.antlr;
}

@lexer::header {
package com.alvazan.orm.parser.antlr;
}


@rulecatch {
catch (RecognitionException e)
{
throw e;
}
}

statement: SELECT EOF!;

SELECT  :   ("S"|"s")("E"|"e")("L"|"l")("E"|"e")("C"|"c")("T"|"t");

WS  :
(   " "
|   "t"
|   "r"
|   "n"
)+
{ $channel=HIDDEN; }
;

ESC :
"\" ("""|"""|"\")
;

Gracias, Decano

Respuestas

2 para la respuesta № 1

Debería obtener una excepción en el análisis, pero no: (:(. Esta es una gramática muy simple con un EOF pero simplemente no funciona.

Si no "t" le dijo a ANTLR que lanzara una excepción,entonces ANTLR podría no lanzar una excepción / error en caso de una entrada no válida. En muchos casos, ANTLR intenta recuperarse de una entrada no coincidente / inválida e intenta continuar con el análisis. Tú será ver la salida se escribe en el stderr en su caso, pero es posible que no obtenga una excepción.

Si tu hacer quiere una excepción en su caso, ver: ANTLR no lanza errores en una entrada no válida