Я хочу написать парсер на F #, и по причинам я должен использовать Antlr.Это означает, что я должен определить класс Visitor
для каждого узла AST, который я хочу проанализировать.Теперь у меня проблема в том, что есть некоторые правила с циклическими зависимостями, такие как:
boolExpr : boolTerm 'or' boolTerm ;
boolTerm : boolAtom 'and' boolAtom ;
boolAtom : '(' boolExpr ')'
| ... ;
, что означает, что мне нужно 3 класса посетителя, которые имеют одинаковую циклическую зависимость, и я хочу, чтобы каждый из них был в отдельном файле
//BoolExprVisitor.fs
let boolExprVisitor = { new BaseVisitor<AST.BoolExpr>() with
override __.VisitBoolExpr(context: BoolExprContext) =
context.boolTerm() |> mapAccept boolTermVisitor |> AST.BoolExpr
}
//BoolTermVisitor.fs
let boolTermVisitor = { new BaseVisitor<AST.BoolTerm>() with
override __.VisitBoolTerm(context: BoolTermContext) =
context.boolAtom() |> mapAccept boolAtomVisitor |> AST.BoolTerm
}
//BoolAtomVisitor.fs
let boolAtomVisitor = { new BaseVisitor<AST.BoolAtom>() with
override __.VisitBoolAtom(context: BoolAtomContext) =
context.boolExpr() |> accept boolExprVisitor |> AST.BoolAtom
}
Но F # не любит эти циклические зависимости.Как я могу заставить F # принять их или реструктурировать своих посетителей так, чтобы они не нуждались в циклических зависимостях?