我正在尝试将我的语法与整个字符串匹配,并且如果它不能消耗整个输入则会将其错误输出。基本上,这个伪正则表达式:
\whitespace* [a-zA-Z]+ [-]? [a-zA-Z]+ \whitespace* $
根据this,EOF应该有效。所以,请考虑这个语法:
start : CHARS EOF
;
CHARS : ('a'..'z')+
;
如果我在此代码中将输入设置为"hello"
:
var ss = new Antlr.Runtime.ANTLRStringStream(input);
var lex = new autocompleteLexer(ss);
var tokens = new CommonTokenStream(lex);
var parser = new autocompleteParser(tokens);
return (BaseTree)(parser.start().Tree);
我得到了一个有两个孩子的AST,HELLO
和EOF
,正如预期的那样。但是如果我将输入设置为说"hello#"
,它会返回相同的树,并且根本不会抱怨哈希。我不确定我做错了什么。
答案 0 :(得分:2)
我发现了问题,那就是Lexer异常被异常传播而不是传播到我的代码中。所以,加上这个:
class ThrowAllLexer: queryLexer
{
public ThrowAllLexer(ICharStream input): base(input) { }
public override void ReportError(RecognitionException e) {
throw e;
}
我现在得到了正确的例外,而不是吞下它们。