簡體   English   中英

如何正確實現ANTLR4訪問者

[英]How to correctly implement an ANTLR4 visitor

我正在嘗試為玩具語言實現解析器。

我已經寫了語法,但是當我嘗試從CST創建AST時遇到了問題。

我定義了一個從MyParserVisitor<ASTNode>繼承的類,其中ASTNode是一個虛擬類,我的類結構中的每個類都從該虛擬類繼承。

現在,我的兩個語法規則如下:

program:
    funcDecl* expr
;
expr:
    constant                                     # constExpr
|   identifier                                   # idExpr
;

其中funcDeclconstantidentifier是終端規則。

當我嘗試為program實現訪問者時,每當我調用函數visit ,都必須將結果轉換為正確的類型。 例如:

@Override
public Program visitProgram(fopplParser.ProgramContext ctx){
    // Rule: funcDecl* expr
    List<FuncDecl> funcs = new LinkedList<FuncDecl>();
    for(fopplParser.FuncDeclContext f : ctx.funcDecl())
        funcs.add((FuncDecl) visit(f));

    Expr expr = (Expr)visit(ctx.expr());
    return new Program(funcs, expr);
}

是否可以某種方式省略所有這些鑄件? 我覺得我在這里做錯了什么。

對於FuncDecl ,我可以將該行更改為funcs.add(visitFuncDecl(f)); 並使用以下簽名pubic FuncDecl visitFuncDecl(fopplParser.FuncDeclContext ctx);實現visitFuncDecl pubic FuncDecl visitFuncDecl(fopplParser.FuncDeclContext ctx); 但我無法使用該表達式執行此操作,因為沒有visitExpr函數,而是兩個函數,即visitConstExprvisitIdExpr

此外,如果我有一個規則,在這種情況下, idList: identifier*不能返回List<Identifier> 我應該創建一個只不過是List<Identifier>的包裝器的類,還是應該直接使Visitor類從MyParserVisitor<Object>繼承?

我認為您混淆了ANTLR訪問者類的含義和打算走解析樹的意圖。 ANTLR訪問者類別用於評估。 可以對其進行參數化,以作為訪問節點的結果返回給定的類(例如,計算表達式時的數學值)。 要遍歷解析樹,請改用解析樹偵聽器。 然后,您可以覆蓋enterXXX和exitXXX函數,並構建符號表或任何您喜歡的符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM