我需要解析一個小表達式語言(和,或者不是,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=>
如果我能找出爲什麼這發生在一個語法,應該是不錯的我應該能夠人物爲什麼同樣的事情發生在我的語法中(非常相似的概念)。
任何人都可以提供任何見解嗎?
是否需要重置詞法分析器令牌流?目前,你已經通過所有的令牌和解析器的第一件事 –
luketorjussen
*懸在頭上的恥辱*是的,是的,我需要調用lex.reset()...嘆氣。我是一個新手,我不知道這個方法,雖然知道這是一個我已經迭代的流,我應該考慮需要重置它,這是一個非常常見的概念。 – Michael
好消息是,這解決了我遇到的問題。但是,這並不能解決我的語法問題。我以爲我發現了這個共同的問題,但完全錯過了這個標記.... arrgghh。 – Michael