[英]How to correctly implement an ANTLR4 visitor
我正在嘗試為玩具語言實現解析器。
我已經寫了語法,但是當我嘗試從CST創建AST時遇到了問題。
我定義了一個從MyParserVisitor<ASTNode>
繼承的類,其中ASTNode
是一個虛擬類,我的類結構中的每個類都從該虛擬類繼承。
現在,我的兩個語法規則如下:
program:
funcDecl* expr
;
expr:
constant # constExpr
| identifier # idExpr
;
其中funcDecl
, constant
和identifier
是終端規則。
當我嘗試為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
函數,而是兩個函數,即visitConstExpr
和visitIdExpr
。
此外,如果我有一個規則,在這種情況下, idList: identifier*
不能返回List<Identifier>
。 我應該創建一個只不過是List<Identifier>
的包裝器的類,還是應該直接使Visitor類從MyParserVisitor<Object>
繼承?
我認為您混淆了ANTLR訪問者類的含義和打算走解析樹的意圖。 ANTLR訪問者類別用於評估。 可以對其進行參數化,以作為訪問節點的結果返回給定的類(例如,計算表達式時的數學值)。 要遍歷解析樹,請改用解析樹偵聽器。 然后,您可以覆蓋enterXXX和exitXXX函數,並構建符號表或任何您喜歡的符號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.