我有以下的語法前瞻:ANTLR詞法分析器不能在所有
rule: 'aaa' | 'a' 'a';
它可以成功地解析字符串「AAA」,但它無法解析「AA」,出現以下錯誤:
line 1:2 mismatched character '<EOF>' expecting 'a'
僅供參考,這是詞法分析器的問題而不是解析器的問題,因爲我甚至不會調用解析器。主要功能是這樣的:
@members {
public static void main(String[] args) throws Exception {
RecipeLexer lexer = new RecipeLexer(new ANTLRInputStream(System.in));
for (Token t = lexer.nextToken(); t.getType() != EOF; t = lexer.nextToken())
System.out.println(t.getType());
}
}
結果是具有較爲明顯的版本是一樣的:
rule: AAA | A A;
AAA: 'aaa';
A: 'a';
顯然ANTLR詞法分析器嘗試匹配與失敗規則AAA輸入「AA」。除了ANTLR是LL(*)解析器之外,詞法分析器應該與解析器分開工作,它應該能夠解決模糊性問題。語法與舊的lex(或flex)很好地工作,但它似乎與ANTLR不同。那麼這裏有什麼問題?
感謝您的幫助!
在詞法分析器中如何定義令牌?在我看來,詞法分析器寧願匹配'a'而不是'aaa',只需要一個'a'作爲輸入。 – Dervall
ANTLR是貪婪的。 –
@Dervall令牌文件看起來像:'A = 4 AAA = 5'它傾向於'aaa'到'a'。它可以解析'aaa'和'a',但不能解析'aa'。 –