Questions tagged «parsers»

有关确定给定字符串是否属于固定形式语言的算法的问题。

2
语言的LR(1)自动机比对应的LR(0)自动机大多少?
在LR(0)解析器中,每个状态都包含LR(0)项的集合,这些项是用位置注释的生成。在LR(1)解析器中,每个状态都由LR(1)项的集合组成,这些项是用位置和超前字符注释的生成。 已知给定LR(1)自动机中的状态,通过从每个LR(1)项中删除前瞻标记形成的配置集会产生与LR(0)自动机中某个状态相对应的配置集。从这个意义上讲,LR(1)自动机和LR(0)自动机之间的主要区别在于LR(1)自动机在LR(0)自动机中具有更多状态副本,每个状态副本都带有前瞻性注释。信息。因此,给定CFG的LR(1)自动机通常大于该CFG的对应LR(0)解析器。 我的问题是LR(1)自动机可以有多大。如果语法字母中有不同的终端符号,则原则上我们可能需要对这不同的终端符号的每个子集至少复制一次LR(0)自动状态中的每个状态,从而可能导致LR(1 )自动机,比原始LR(0)自动机大倍。假设LR(0)自动机中的每个单独项目都由一组不同的LR(0)项目组成,我们可能会得到更大的爆炸。n 2 nnnnnnn2n2n2^n 就是说,我似乎找不到一种方法来构造其LR(1)自动机明显大于相应的LR(0)自动机的语法家族。我尝试过的所有操作都导致大小的适度增加(通常为2-4倍左右),但我似乎找不到能够导致大爆炸的模式。 是否存在已知的上下文无关语法族,它们的LR(1)自动机比对应的LR(0)自动机大几倍?还是众所周知,在最坏的情况下,您实际上无法得到指数级的爆炸? 谢谢!


3
具有语法
谁能启发我,为什么尝试回溯产生式和(按顺序)的带有回溯的递归下降解析器不能识别语法形成的语言。小号→ 一个一个小号→ 一个小号一个| 一个一个小号→ 一个小号一个小号→一个小号一个S \rightarrow aSa小号→ 一个一个小号→一个一个S \rightarrow aa小号→ 一个小号一个| 一个一个 小号→一个小号一个 | 一个一个S \rightarrow aSa\ |\ aa 它似乎只能解析语言单词。{ a2ñ | Ñ≥1 }{a2ñ | n≥1个}\{a^{2^n}\ |\ n \ge 1 \} 我使用具有生产规则的ABNF Parser Generator生成了这样的解析器,例如,S = "a" S "a" / "aa"解析器无法识别单词aaaaaa。 我希望它使用生产,直到解析树的终端节点从7左边开始串联的,然后去分析树选择生产小号→ 一个一个来代替,直到树看起来像这样:小号→ 一个S一个小号→一个小号一个S \rightarrow aSaa小号→ 一个一个小号→一个一个S \rightarrow aa S / …

2
除了“最接近匹配”之外,还有其他解决“悬而未决”问题的方法吗?
以下上下文无关文法呈现出“悬空别的”型歧义(想象代表和代表和代表一些其他类型的指令或块): 例如,可以将解析为或(这是该语法中最简单/最短的歧义词)。b c Sa一个aif expr thenbbbelsecCc aacbc(a(acbc))(a(ac)bc)S→aSbS|aS|c小号→一个小号b小号|一个小号|C \begin{aligned} S &\rightarrow aSbS \;|\; aS \;|\; c\\ \end{aligned} aacbc一个一个CbCaacbc(a(acbc))(一个(一个CbC))(a(acbc))(a (a c )b c )(一个(一个C)bC)(a(ac)bc) 解决这种“悬而未决”的歧义的“标准”方式迫使“其他”()语句与最接近/最内的“如果-那么”()配对。这可以通过以下方式完成: 这个语法是明确的。在上面的示例中,它强制执行解析。一个小号bbb一个一个a(a(acbc))小号Ť→ 一个Ťb 小号|一个小号|C→ 一个Ťb Ť|C小号→一个Ťb小号|一个小号|CŤ→一个ŤbŤ|C \begin{aligned} S &\rightarrow aTbS \;|\; aS \;|\; c\\ T &\rightarrow aTbT \;|\; c\\ \end{aligned} (a (a c b c ))(一个(一个CbC))(a(acbc)) 问题:是否存在另一种自然方法来解决会导致解析?换句话说,我正在寻找一种语法,该语法生成​​与上述两种语言相同的语言,并且语言明确,并且将解析为。(a (a …

1
如何从Earley向量重建语法树森林?
使用Earley向量作为识别器非常简单:到达字符串的末尾时,您只需检查从位置0开始的已完成的公理化生产。如果您至少有一个,则接受该字符串。 使用Earley向量重建解析树不太明显。实际上,我无法弄清楚算法程序的工作方式,而且我发现的唯一参考文献要么含糊不清,要么含糊不清。有人可以阐明吗?

2
用于括号匹配的二态图灵机
在大学里,我们一直在学习通用计算机和图灵机的计算理论。出色的理论结果之一是,以可能会变大的字母(符号)为代价,您可以将状态数减少到仅2个。 我一直在寻找不同图灵机的示例,并且提供的常见示例是括号匹配器/检查器。本质上,它检查一串括号(()()()))()()()是否是否平衡(例如,前面的示例将为不平衡返回0)。 尽我所能,我只能使它成为三态机。我想知道是否有人可以将其降低到理论上的最小值2,以及他们的方法/状态/符号是什么! 为了清楚起见,括号是“夹在”空白磁带之间的,因此在上面的示例中, - - - - - - - (()()()))()()() - - - - - - -将是磁带上的输入。该字母将包括(,),1,0,-,和*halt*状态不能算作一个状态。 作为参考,我使用的三种状态方法如下:状态描述: State s1: Looks for Closing parenthesis State s2: Looks for Open parenthesis State s3: Checks the tape to ensure everything is matched Symbols: ),(,X 转换列为: Action: State Symbol NewState WriteSymbol …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.