Questions tagged «parsers»

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

1
LL和LR语法的语言理论比较
人们经常说LR(k)解析器比LL(k)解析器更强大。这些陈述在大多数时候都含糊不清。特别是,我们应该比较固定的类还是所有的并集?那么情况如何呢?我尤其对LL(*)如何适合感兴趣。kkkkkk 据我所知,语法分析器LL和LR接受的各个语法集合是正交的,因此让我们来谈谈由各个语法集合产生的语言。令表示由解析器可以解析的语法生成的语言的类别,其他类别也类似。LR(k)LR(k)LR(k)LR(k)LR(k)LR(k) 我对以下关系感兴趣: LL(k)⊆?LR(k)LL(k)⊆?LR(k)LL(k) \overset{?}{\subseteq} LR(k) ⋃∞i=1LL(k)⊆?⋃∞i=1LR(k)⋃i=1∞LL(k)⊆?⋃i=1∞LR(k)\bigcup_{i=1}^{\infty} LL(k) \overset{?}{\subseteq} \bigcup_{i=1}^{\infty} LR(k) ⋃∞i=1LL(k)=?LL(∗)⋃i=1∞LL(k)=?LL(∗)\bigcup_{i=1}^{\infty} LL(k) \overset{?}{=} LL(*) LL(∗)∘?⋃∞i=1LR(k)LL(∗)∘?⋃i=1∞LR(k)LL(*) \overset{?}{\circ} \bigcup_{i=1}^{\infty} LR(k) 其中一些可能很容易。我的目标是收集一个“完整”的比较。参考被赞赏。

1
是否有任何可识别EPAL的非常规CFG解析算法?
EPAL,甚至回文的语言,被定义为以下明确的上下文无关语法生成的语言: S→aaS→aaS \rightarrow a a S→bbS→bbS \rightarrow b b S→aSaS→aSaS \rightarrow a S a S→bSbS→bSbS \rightarrow b S b EPAL是许多解析算法的“祸根”:我还没有遇到任何能够解析任何描述该语言的语法的CFG解析算法。它通常用于表明存在明确的CFG,而这些CFG无法被特定的解析器解析。这激发了我的问题: 是否有一些解析算法仅接受适用于EPAL的明确CFG? 当然,可以为语法设计一个临时的两次通过语法分析器,以线性时间解析语言。我对解析不是专门为EPAL设计的方法感兴趣。

3
解析任意上下文无关的语法,主要是简短的摘要
我想解析用户定义的域特定语言。这些语言通常接近数学符号(我不是在解析自然语言)。用户以BNF表示法定义其DSL,如下所示: expr ::= LiteralInteger | ( expr ) | expr + expr | expr * expr 像输入1 + ( 2 * 3 )必须接受,而像输入1 +必须予以拒绝为不正确,并输入像1 + 2 * 3必须被拒绝暧昧。 这里的中心难题是以一种用户友好的方式处理模棱两可的语法。限制语法的唯一性不是一种选择:这就是语言的方式-想法是作者宁愿在不必要时避免使用括号来避免歧义。只要表达式不是模棱两可的,我就需要解析它,如果不是,我就必须拒绝它。 我的解析器必须能够处理任何与上下文无关的语法,即使是模棱两可的语法,也必须接受所有明确的输入。我需要所有接受的输入的分析树。对于无效或模棱两可的输入,理想情况下,我希望得到良好的错误消息,但首先,我将尽我所能。 通常,我将在相对较短的输入上调用解析器,而偶尔会有较长的输入。因此,渐近更快的算法可能不是最佳选择。我想针对少于80个符号长的输入,大约20%和50个符号之间的19%以及很少的较长输入的1%的分布进行优化。无效输入的速度不是主要问题。此外,我希望大约每1000至100000个输入都可以修改DSL。我可以花几秒钟来预处理我的语法,而不是几分钟。 给定我的典型输入大小,我应该研究哪种解析算法?错误报告应该成为我选择的一个因素,还是应该专注于解析明确的输入并可能运行一个完全独立的,较慢的解析器以提供错误反馈? (在需要时(前一段时间)的项目中,我使用了CYK,实现起来并不难,并且可以很好地适应我的输入大小,但不会产生非常好的错误。)

2
对于每个“邪恶”的正则表达式,是否存在非邪恶的替代项,还是语法中的恶魔?
显然,ReDos攻击利用了某些(其他有用的)正则表达式的特征...本质上导致了通过NFA定义的图的可能路径的爆炸式增长。 通过编写等效的“非邪恶”正则表达式可以避免此类问题吗?如果不是这样(因此,NFA无法在实际的空间/时间中处理语法),哪种解析方法会更好?为什么?


1
为什么要分开词法和解析?
可以使用状态机的一次传递来解析文档。两次通过,即有什么好处?有一个词法分析器将文本转换为令牌,并有一个解析器来测试这些令牌的生产规则?为什么没有一次将生产规则直接应用于文本的过程?


1
何时获得“从左到右扫描,最右派生”的含义?
根据Wikipedia的文章,的L 表示“从左到右扫描”,“ R”表示“最右派生”。但是,在Knuth关于语法的原始论文中,他将(在第610页)定义为一种语言,该语言“可以从左向右翻译为边界。L R (k )大号[R(ķ)LR(k)L R (k )大号[R(ķ)LR(k)L R (k )大号[R(ķ)LR(k)ķķk 我猜想是选择了这种新术语来补充解析的“从左到右扫描,最左派生”。也就是说,我不知道该术语何时更改了含义。L L (k )大号大号(ķ)LL(k) 有谁知道的新缩写来自哪里?L R (k )大号[R(ķ)LR(k)

3
如果将参数添加到上下文无关文法中,将会得到什么?
我当时在考虑对倾向性敏感的语言的语法,如果将CF语法与参数结合使用,它似乎可以解决问题。例如,考虑以下片段,以类似于ANTLR的格式简化Python语法: // on top-level the statements have empty indent program : statement('')+ ; // let's consider only one compound statement and one simple statement for now statement(indent) : ifStatement(indent) | passStatement(indent) ; passStatement(indent) : indent 'pass' NEWLINE ; // statements under if must have current indent plus 4 spaces ifStatement(indent) …

5
非不确定性与确定性有何不同?
我试图理解“确定性上下文无关语法”等表达中的“确定性”是什么意思。(在该字段中还有更多确定性的“事物”)。除了最详尽的解释之外,我将不胜感激一个例子!如果可能的话。 我困惑的主要根源在于无法分辨语法的这种性质与(非)歧义有何不同。 我最想找到的意思是D. Knuth 在论文《语言从左到右的翻译》中的这句话: Ginsburg和Greibach(1965)定义了确定性语言的概念。我们在第五节中表明,这些正是存在LR(k)语法的语言 一旦到达Section V,它就变成循环了,因为那里说LR(k)解析器可以解析的是确定性语言... 下面是一个示例,可以帮助我理解“歧义”的含义,请看一下: onewartwoearewe 可以将其解析为- one war two ear ewe或o new art woe are we-如果语法允许(例如,它列出了我刚刚列出的所有单词)。 我需要做些什么才能使示例语言具有不确定性?(例如,我可以o从语法中删除单词,以使语法不模糊)。 以上语言是确定性的吗? PS。这个例子来自《哥德尔,埃舍尔,巴赫:永恒的金辫子》一书。 假设我们为示例语言定义了语法,如下所示: S -> A 'we' | A 'ewe' A -> B | BA B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' …

3
为什么对二进制数据使用词法分析器/解析器如此错误?
我经常使用lexer / parsers而不是解析器组合器,并且看到从未参加过解析类的人问起解析二进制数据的问题。通常,数据不仅是二进制的,而且是上下文相关的。这基本上导致只有一种令牌,即字节令牌。 有人可以解释为什么对于没有参加语法课程但有理论基础的CS学生来说,用词法分析器/语法分析器解析二进制数据如此错误并且足够清晰。

2
除去语法中的左递归,同时保持运算符的左关联
我对此练习有疑问: 令G为λ微积分的以下歧义语法: E → v | λv.E | EE | (E) 其中E是单个非终结符号,λv.E表示带有E中变量v的抽象,而EE表示应用。 定义LL(1)语法G',以使L(G')= L(G)并通过施加以下常用约定来解决G的歧义: 抽象是正确的关联; 申请保持关联; 应用程序具有比抽象更高的优先级。 显示G'的LL(1)解析表和解析字符串时获得的解析树λv1. λv2. v1v2v1。 我消除了歧义设置的优先级和关联,获得了以下语法: E -> EF | F F -> λv.G | G G -> (E) | v 这不是LL(1),因为生产E -> EF是递归的。但是,从该生产中消除左递归可以获得: E -> FE¹ E¹-> FE¹ | ɛ F -> λv.G | …


2
正则表达式语言是否需要下推自动机进行解析?
我想将用户输入的正则表达式转换为NFA,以便随后可以对字符串运行NFA以进行匹配。可用于解析正则表达式的最低机器是什么? 我认为它必须是下推式自动机,因为方括号的含义意味着需要计数,而DFA / NFA不能执行任意计数。这个假设正确吗?例如,表达式a(bc *)d需要使用PDA,以便正确处理括号中的子表达式。

3
语法LL(1)怎么样?
这是《龙书》中的一个问题。这是语法: S→AaAb∣BbBaS→AaAb∣BbBaS \to AaAb \mid BbBa A→εA→εA \to \varepsilon B→εB→εB \to \varepsilon 问题问如何显示它是LL(1)而不是SLR(1)。 为了证明它是LL(1),我尝试构造它的解析表,但是在一个单元格中有多个生成,这是矛盾的。 请告诉我们LL(1)怎么样,如何证明它?

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.