我正在重写这篇文章(虽然同样的问题,更少的话)。
我重写了我的语法,只在顶层有这个
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');
然后我有以下java代码(我的解析器上没有解析方法,就像我在其他人的帖子上看到的那样:(:()...
@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);
}
}
我应该在解析时得到一个异常,但我没有:( :(。这是一个非常简单的带有 EOF 的语法,但它只是不起作用。有什么想法吗?我是在调用错误的解析语句吗?
注意:我试图通过将问题简化为似乎不起作用的简单事情来简化更大的问题。
完整的(非常小的)语法文件在这里
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 :
'\\' ('"'|'\''|'\\')
;
谢谢,院长