2016-04-14 80 views
1

在下面的語法:防止含糊不清語法

expr : r1 EOF 
    | r2 EOF 
    ; 

r1 : '1' L1 'x' ; 
r2 : '1' L2 'y' ; 

L1: 'a' ; 
L2: 'a' ; 

當我解析表達式

1ay 

我希望解析器創建相應的解析樹,但是我越來越出現以下錯誤:

line 1:2 mismatched input 'y' expecting 'x'

爲什麼不能正確解析它?我可以給它指令嗎?

解析代碼:在解析

private static void parse(String str) 
{ 
    ANTLRInputStream input = new ANTLRInputStream(str); 
    AmbLexer lexer = new AmbLexer(input); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    AmbParser parser = new AmbParser(tokens); 
    ParseTree tree = parser.expr(); 
    System.err.println(tree.toStringTree(parser)); 
} 

回答

2

第一步是創建基於詞法分析規則記號流。該令牌是使用首先匹配的規則創建的。所以在你的情況下,每個'a'將是L1。因爲r1只是包含L1的解析器規則,所以它不能匹配輸入,因爲規則'r1'期望'x',而不是'y'。

因此,詞法分析規則必須排序,因此特殊和更具體的規則將在更模糊的規則之前進行排序。作爲字符串的規則,數字將在最後,但規則爲'func','class'將在它們之前。

要解決該問題,請將L1和L2合併爲一個規則,並在兩個解析器規則中使用它。