2011-09-07 151 views
2

我需要解析一個小表達式語言(和,或者不是,parens改變優先順序)所以選擇ANTLR來完成任務,我取得了很好的進展ANTLRWorks對於新手來說非常好)。我用從ANTLR網站一些起步部分引用,然後發現了兩個博客文章是非常適合我試圖做到:所有的ANTLR語法都會產生錯誤「在輸入處沒有可行的替代方案」<EOF>'「

http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx http://www.alittlemadness.com/2006/06/05/antlr-by-example-part-1-the-language

我遇到的問題是,不管輸入什麼我把我總是得到錯誤:

線1:29在輸入「EOF」

因此,沒有可行的替代方案爲我排除故障的一部分,我決定嘗試我知道語法是好的,產生從詞法分析器/分析器首先發現ECalc.g語法鏈接。令我驚訝的是,在使用該語法時,我得到了同樣的錯誤!我被詛咒了。我對語法做的唯一修改是讓它生成Java代碼,並在@members部分取出一些CSharp代碼。

這裏是我的測試類:

public class ECalcTester { 
private final static Logger logger = Logger.getLogger(ECalcTester.class); 

public static void main(String[] args) { 
    BasicConfigurator.configure(); 
    ECalcLexer lex = new ECalcLexer(new ANTLRStringStream("false || not (false and true)")); 

    Token token; 
    while (true) { 
     token = lex.nextToken(); 
     if (token.getType() == Token.EOF) { 
      break; 
     } 

     System.out.println("Token: ‘" + token.getText() + "’"); 
    } 

    CommonTokenStream tokens = new CommonTokenStream(lex); 
    lex.nextToken(); 

    ECalcParser parser = new ECalcParser(tokens); 
    try { 
     logger.debug(parser.expression().getTree()); 
    } catch (org.antlr.runtime.RecognitionException e) { 
     logger.error("Exception ", e); 
    } 

} 

這裏是輸出:

Token: ‘false’ 
Token: ‘ ’ 
Token: ‘||’ 
Token: ‘ ’ 
Token: ‘not’ 
Token: ‘ ’ 
Token: ‘(’ 
Token: ‘false’ 
Token: ‘ ’ 
Token: ‘and’ 
Token: ‘ ’ 
Token: ‘true’ 
Token: ‘)’ 
line 1:29 no viable alternative at input '<EOF>' 
0 [main] DEBUG ECalcTester - <unexpected: [@0,29:29='<EOF>',<-1>,1:29], resync=> 

如果我能找出爲什麼這發生在一個語法,應該是不錯的我應該能夠人物爲什麼同樣的事情發生在我的語法中(非常相似的概念)。

任何人都可以提供任何見解嗎?

+1

是否需要重置詞法分析器令牌流?目前,你已經通過所有的令牌和解析器的第一件事 luketorjussen

+0

*懸在頭上的恥辱*是的,是的,我需要調用lex.reset()...嘆氣。我是一個新手,我不知道這個方法,雖然知道這是一個我已經迭代的流,我應該考慮需要重置它,這是一個非常常見的概念。 – Michael

+0

好消息是,這解決了我遇到的問題。但是,這並不能解決我的語法問題。我以爲我發現了這個共同的問題,但完全錯過了這個標記.... arrgghh。 – Michael

回答

5

打印出您的令牌後,您將位於令牌流的末尾。您將需要通過調用

lex.reset(); 

這將使詞法分析器回到令牌流的開始,所以你可以打電話給你的解析器標流復位。

相關問題