f# – 模块的循环依赖
发布时间:2020-12-13 20:09:54 所属栏目:百科 来源:网络整理
导读:我想在F#中编写一个解析器,因为我必须使用Antlr.这意味着我必须为每个要解析的AST节点定义一个Visitor类.现在我遇到的问题是存在一些循环依赖的规则,例如: boolExpr : boolTerm 'or' boolTerm ;boolTerm : boolAtom 'and' boolAtom ;boolAtom : '(' boolExp
我想在F#中编写一个解析器,因为我必须使用Antlr.这意味着我必须为每个要解析的AST节点定义一个Visitor类.现在我遇到的问题是存在一些循环依赖的规则,例如:
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#接受它们或重构我的访问者以不需要cyclid依赖?
对于未来遇到此问题的任何人:
正如rmunn所说,我希望不同文件中的类的事实根本不是好设计.此外,我不需要为BoolTerm,BoolAtom和BoolExpr使用不同的AST节点,因为它们都可以被描述为相同的节点BoolExpr. 我的解决方案是将所有布尔表达式访问者合并到同一个类中(并将表达式访问者的所有文件合并到一个文件中): //AST.fs type BoolExpr = | BoolConjunctionExpr of BoolOp * BoolExpr list | ... //ExpressionVisitors.fs let boolExprVisitor = { new BaseVisitor<AST.BoolExpr>() with override this.VisitBoolExpr(context: BoolExprContext) = context.boolTerm() |> mapAccept this |> AST.BoolConjunctionExpr AST.Or override this.VisitBoolTerm(context: BoolTermContext) = context.boolAtom() |> mapAccept this |> AST.BoolConjunctionExpr AST.And override this.VisitBoolAtom(context: BoolAtomContext) = context.boolExpr() |> accept this } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |