我正在设计用于学习目的的HTML解析器。我第一次创建整体设计。
存储HTML元素的数据结构。
Base
:HtmlBaseElement
Derived
:HTMLElement,PElement,HtagElemement,ImgElement,BodyElement,StrongElement
基本上,我将为HTML中的每种元素创建一个派生类。
我需要将此HTML文件写回文件,并允许用户在已经解析的HTML文件中添加该元素。
这就是我的想法:
第一种方法:
为每种元素创建一个具有访问功能的BaseVisitor
。
创建派生访客类WriteHtmlVisitor
以编写整个文件,该文件将visit
HTML数据结构中的每个元素。
第二种方法:
我也可以使用具有WriteHtmlFile
对象的类HTMLElement
,然后使用所有元素的getter来编写它。
这是编写HTML文件并在文件中添加新元素的最佳方式。
我只是在寻找一个建议,因为这是在设计阶段。
感谢。
答案 0 :(得分:0)
是的,访问者的布局是可行的,在IntelliJ IDEA的插件中我们一直使用它。
举一个具体的例子:在IDEA中,我们在编辑器中有一种代码的抽象语法树。使用递归访问者,您可以将每个元素转换为其字符串表示形式,并将工作分发给许多小而易于理解的方法。每个visitXXX
只是将一小部分转换为字符串并递归调用visit
方法。
优点是这很容易理解和调试。我遇到的唯一缺点是你需要一个访问方法来处理基类中的所有元素类型。然而,一旦设置,它就像一个魅力。
我可以给你看Java代码,虽然它具有特定的IDEA,但应该清楚地理解它。 Here is the base class为访问者定义所有可能元素的方法。以及here is an example你所想到的:一个将元素转换为字符串表示形式的访问者。
希望这会有所帮助,您不必介意Java代码。