Data structures 如何实现图结构堆栈?
好的,我想做一个GLR解析器生成器。我知道有这样的项目比我可能制作的更好,但我这么做是为了好玩/学习,所以这并不重要 我一直在读关于GLR解析的书,我想我现在对它有了相当高的理解。但现在是开始谈正事的时候了Data structures 如何实现图结构堆栈?,data-structures,graph,parsing,stack,glr,Data Structures,Graph,Parsing,Stack,Glr,好的,我想做一个GLR解析器生成器。我知道有这样的项目比我可能制作的更好,但我这么做是为了好玩/学习,所以这并不重要 我一直在读关于GLR解析的书,我想我现在对它有了相当高的理解。但现在是开始谈正事的时候了 图结构堆栈(GSS)是用于GLR解析器的关键数据结构。从概念上讲,我知道GSS是如何工作的,但到目前为止,我所看到的所有资料都没有解释如何实现GSS。我甚至没有一个权威的操作列表来支持。有人能给我指出一些GSS的好的示例代码/教程吗?到目前为止,谷歌没有提供帮助。我希望这个问题不要太含糊。你
图结构堆栈(GSS)是用于GLR解析器的关键数据结构。从概念上讲,我知道GSS是如何工作的,但到目前为止,我所看到的所有资料都没有解释如何实现GSS。我甚至没有一个权威的操作列表来支持。有人能给我指出一些GSS的好的示例代码/教程吗?到目前为止,谷歌没有提供帮助。我希望这个问题不要太含糊。你所问的问题不是无关紧要的。我看到两种主要的方法:
我应该提到的是,鉴于这种模型的广泛应用,我希望有更多关于表示有向无环图(或图结构堆栈,如果您愿意的话)的信息。我认为还有空间找到更好的解决方案。首先,如果你还没有,你应该阅读McPeak关于GLR的论文。这是一篇学术论文,但它详细介绍了GSS、GLR以及用于实现它们的技术。它还解释了实现GLR解析器的一些棘手问题 实现图结构堆栈有三个部分 一、图形数据结构本身 二,。堆叠 三、 GLR对GSS的使用 你说得对,谷歌帮不了什么忙。除非你喜欢阅读算法书籍,否则它们也不会有多大帮助 一、图形数据结构 Rob关于“直接代表”的回答最容易实现。它很像一个链表,只是每个节点都有一个下一个节点的列表,而不是一个 此数据结构是一个有向图,但正如McPeak所述,GSS可能具有epsilon文法的循环 二,。堆叠 图结构堆栈在概念上只是一组常规堆栈。对于明确的语法,您只需要一个堆栈。当存在解析冲突时,需要更多堆栈,以便可以同时执行两个解析操作,并保持两个操作创建的不同状态。使用图形可以利用这些堆栈共享元素这一事实 这可能有助于理解如何首先使用链表实现单个堆栈。链表的头是堆栈的顶部。将元素推到堆栈上只是创建一个新头部并将其指向旧头部。从堆栈中弹出一个元素只是将指针移动到head->next 在GSS中,原理是相同的。推送一个元素只是创建一个新的头部节点并将其指向旧的头部。如果有两个shift操作,则将两个元素推送到旧头部,然后有两个头部节点。从概念上讲,这只是两个不同的堆栈,它们共享除顶部元素之外的每个元素。弹出一个元素只是通过跟随下一个节点将头部指针向下移动 三、 GLR对GSS的使用 这就是麦克皮克的论文值得一读的地方 GLR算法通过合并具有相同状态元素的堆栈头来利用GSS。这意味着一个状态元素可能有多个子元素。减少时,GLR算法必须探索堆栈头的所有可能路径 可以通过保持每个节点的确定深度来优化GLR。这只是与堆栈中拆分的距离。这样,您就不必总是搜索堆栈拆分
这是一项艰巨的任务!祝你好运 在这里,六年过去了,在GSS数据结构上似乎仍然没有发现什么。Wikipedia有一个非常简短的“示例”,但它也没有列举操作,我对此感到困惑,因为它似乎在同一深度上有所有“并行”堆栈。有人能补充更多的信息吗?