Data structures 如何实现图结构堆栈?

Data structures 如何实现图结构堆栈?,data-structures,graph,parsing,stack,glr,Data Structures,Graph,Parsing,Stack,Glr,好的,我想做一个GLR解析器生成器。我知道有这样的项目比我可能制作的更好,但我这么做是为了好玩/学习,所以这并不重要 我一直在读关于GLR解析的书,我想我现在对它有了相当高的理解。但现在是开始谈正事的时候了 图结构堆栈(GSS)是用于GLR解析器的关键数据结构。从概念上讲,我知道GSS是如何工作的,但到目前为止,我所看到的所有资料都没有解释如何实现GSS。我甚至没有一个权威的操作列表来支持。有人能给我指出一些GSS的好的示例代码/教程吗?到目前为止,谷歌没有提供帮助。我希望这个问题不要太含糊。你

好的,我想做一个GLR解析器生成器。我知道有这样的项目比我可能制作的更好,但我这么做是为了好玩/学习,所以这并不重要

我一直在读关于GLR解析的书,我想我现在对它有了相当高的理解。但现在是开始谈正事的时候了


图结构堆栈(GSS)是用于GLR解析器的关键数据结构。从概念上讲,我知道GSS是如何工作的,但到目前为止,我所看到的所有资料都没有解释如何实现GSS。我甚至没有一个权威的操作列表来支持。有人能给我指出一些GSS的好的示例代码/教程吗?到目前为止,谷歌没有提供帮助。我希望这个问题不要太含糊。

你所问的问题不是无关紧要的。我看到两种主要的方法:

  • 直接代表。您的数据结构在内存中表示为节点对象/结构,其中每个节点在堆栈上都有一个指向其下方结构的引用/指针(也可以将引用设置为双向引用)。这是通常在内存中表示列表和树的方式。在这种情况下要复杂一些,因为与树或列表不同,树或列表只需要维护对根节点或头节点的引用来跟踪树,这里我们需要维护对所有“顶级”节点的引用列表

  • 邻接列表表示法。这与数学家喜欢思考图形的方式类似:G=(V,E)。维护一个边列表,由顶点索引,顶点是每条边的原点和终止点

  • 第一个选项的优点是,只要GSS不是太平,遍历速度就会更快。但是,这种结构稍微更难使用。你必须推出许多自己的算法

    第二种选择的优点是更容易处理。教科书中的大多数算法似乎采用某种邻接列表表示,这使得应用大量的图算法变得更容易

    一些资源:

    有各种类型的邻接列表,例如基于哈希表、基于数组等。wikipedia页面是一个很好的起点

    来自一个一直在处理同一问题的人。代码是clojure,可能熟悉也可能不熟悉,但讨论值得一看,即使不熟悉


    我应该提到的是,鉴于这种模型的广泛应用,我希望有更多关于表示有向无环图(或图结构堆栈,如果您愿意的话)的信息。我认为还有空间找到更好的解决方案。

    首先,如果你还没有,你应该阅读McPeak关于GLR的论文。这是一篇学术论文,但它详细介绍了GSS、GLR以及用于实现它们的技术。它还解释了实现GLR解析器的一些棘手问题

    实现图结构堆栈有三个部分

    一、图形数据结构本身

    二,。堆叠

    三、 GLR对GSS的使用

    你说得对,谷歌帮不了什么忙。除非你喜欢阅读算法书籍,否则它们也不会有多大帮助

    一、图形数据结构

    Rob关于“直接代表”的回答最容易实现。它很像一个链表,只是每个节点都有一个下一个节点的列表,而不是一个

    此数据结构是一个有向图,但正如McPeak所述,GSS可能具有epsilon文法的循环

    二,。堆叠

    图结构堆栈在概念上只是一组常规堆栈。对于明确的语法,您只需要一个堆栈。当存在解析冲突时,需要更多堆栈,以便可以同时执行两个解析操作,并保持两个操作创建的不同状态。使用图形可以利用这些堆栈共享元素这一事实

    这可能有助于理解如何首先使用链表实现单个堆栈。链表的头是堆栈的顶部。将元素推到堆栈上只是创建一个新头部并将其指向旧头部。从堆栈中弹出一个元素只是将指针移动到head->next

    在GSS中,原理是相同的。推送一个元素只是创建一个新的头部节点并将其指向旧的头部。如果有两个shift操作,则将两个元素推送到旧头部,然后有两个头部节点。从概念上讲,这只是两个不同的堆栈,它们共享除顶部元素之外的每个元素。弹出一个元素只是通过跟随下一个节点将头部指针向下移动

    三、 GLR对GSS的使用

    这就是麦克皮克的论文值得一读的地方

    GLR算法通过合并具有相同状态元素的堆栈头来利用GSS。这意味着一个状态元素可能有多个子元素。减少时,GLR算法必须探索堆栈头的所有可能路径

    可以通过保持每个节点的确定深度来优化GLR。这只是与堆栈中拆分的距离。这样,您就不必总是搜索堆栈拆分


    这是一项艰巨的任务!祝你好运

    在这里,六年过去了,在GSS数据结构上似乎仍然没有发现什么。Wikipedia有一个非常简短的“示例”,但它也没有列举操作,我对此感到困惑,因为它似乎在同一深度上有所有“并行”堆栈。有人能补充更多的信息吗?