2017-04-14 65 views
0

我有一個用antlr2語法編寫的語法文件,需要幫助瞭解如何重寫antlr4語法中的一些解析器規則。我知道antlr4消除了構建AST的必要性,所以我不確定如何處理AST動作翻譯ANTLR Tree Construction解釋了一些語法和如何使用#構造,但我仍然不確定如何閱讀這些規則並重新編寫它們。重寫AST動作翻譯爲ANTLR4

temp_root : 
    temp { #temp_root = #([ROOT, "root"], #temp_root); } EOF; 

temp : 
    c:temp_content 
     { #temp = #(#([FUNCTION_CALL, "template"], #template), c); 
      reparent((MyAST)#temp, MyAST)#c); }; 

temp_content : 
    (foo | bar); 

foo :  
    { 
     StringBuilder result = new StringBuilder(""); 
    } 
    : (c:FOO! { result.append(c.getText()); })+ 
    { #foo = #([TEMPLATE_STRING_LITERAL, result.toString()], #foo); }; 

bar : 
    BEGIN_BAR! expr END_BAR! 
    exception 
     catch [Exception x] { 
      bar_AST = handleException(x); 
     }; 
+0

每個「#」表示節點中應該有一個「子樹」嗎? – Raven

回答

0

你不能操縱產生的解析樹(至少不是語法的代碼),所以只要刪除所有樹改寫的東西(你可能需要調整消費代碼,如果依賴於特定的樹形結構)。同時刪除感嘆號(表示不應出現在AST中的令牌)。令人驚訝的是c:FOO部分。不記得曾見過這個。但從下面的行動代碼判斷,我想這是一個無功分配,應該改寫爲c = FOO