如何写文本变换器?

时间:2010-03-02 16:15:45

标签: parsing lexical-analysis

假设我有一个可以轻松解析的文本。它由文本和特殊标识符组成。解析后,我得到一个与文本中的文本和特殊标识符相对应的标记列表。

我遇到的问题是如何将其从此令牌列表转换为其他形式?

我无法理解如何解决这个问题。

我尝试构建一个解析树,但我不明白下一步该做什么。

请告知解决此问题的一般问题。

1 个答案:

答案 0 :(得分:3)

获得令牌流后,您可以使用解析器生成器并指定语言的grammar将其转换为解析树。

根据您要使用的编程语言,您可能需要查看以下解析器生成器:

C / C ++ - Yacc

Java - ANTLR(也是JavaCC,SableCC)

Python - PLY(Python Lex / Yacc)

OCaml - ocamlyacc

如果您不了解语法,那么您选择的解析器生成器的文档应该足以让您前进。

当您的解析器完成后,它将使用令牌流并使用中间表示构建树 - 您定义的类型用于表示您的语言的各个部分(如您提到的文本和特殊标识符)。然后,您可以根据需要操作树。

编辑:在回复您的评论时 - 我不太清楚会给您什么样的答案,因为我无法确切地说出您遇到了什么问题。首先,您熟悉tree data structures吗?如果是这样,您是否知道如何编写一个简单的递归算法来查找树的高度,或者运行深度优先搜索?请记住,树只是一种组织信息的方式 - 完全取决于您对该信息的处理方式。

将算法应用于异构树(即节点属于不同类型的树)的常见设计模式是Visitor pattern。如果您已熟悉树木,可以用您喜欢的语言查找访客模式的示例;但是,如果这个概念对你来说是新的,我强烈建议你从更简单的算法开始。