2010-10-08 79 views
2

我試圖將我的語法匹配到整個字符串,並且如果它不能消耗整個輸入,就會出錯。基本上,這個僞正則表達式:ANTLR匹配到輸入結束

\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有兩個孩子,HELLOEOF,符合市場預期。但是,如果我將輸入設置爲"hello#",它將返回相同的樹,並且根本不抱怨哈希。我不確定我做錯了什麼。

回答

2

我發現問題,它是異常被Lexer困住而不是傳播到我的代碼中。所以,加入這個:

class ThrowAllLexer: queryLexer 
{ 
    public ThrowAllLexer(ICharStream input): base(input) { } 
    public override void ReportError(RecognitionException e) { 
     throw e; 
} 

我現在得到適當的例外,而不是讓他們被吞下。