Parsing 解析特殊情况

Parsing 解析特殊情况,parsing,context-free-grammar,peg,ll,lr,Parsing,Context Free Grammar,Peg,Ll,Lr,如果我理解正确,解析会将一系列符号转换为一棵树。我的问题是,是否可以使用一些标准过程(LR、LL、PEG等)来解析以下两个示例,或者是否有必要手工编写专门的解析器 Python源代码,即空格缩进块 我想我在某个地方读到,解析器跟踪前导空格的数量,并假装用花括号代替它们来划分块。从根本上说,这是因为标准解析技术不够强大,还是出于性能原因 PNG图像格式,其中块以标题和块大小开头,之后是块的内容 内容可能包含类似于某个标头的字节,因此有必要“知道”下一个x字节不会被“解析”,即它们应该被跳过。比如说

如果我理解正确,解析会将一系列符号转换为一棵树。我的问题是,是否可以使用一些标准过程(LR、LL、PEG等)来解析以下两个示例,或者是否有必要手工编写专门的解析器

  • Python源代码,即空格缩进块
  • 我想我在某个地方读到,解析器跟踪前导空格的数量,并假装用花括号代替它们来划分块。从根本上说,这是因为标准解析技术不够强大,还是出于性能原因

  • PNG图像格式,其中块以标题和块大小开头,之后是块的内容

  • 内容可能包含类似于某个标头的字节,因此有必要“知道”下一个x字节不会被“解析”,即它们应该被跳过。比如说,如何用PEG来表达这一点?换句话说,“结束括号”由内容的长度表示。

    实际上,几乎所有解析器构造都需要一些巧妙的边缘技巧来克服解析机制的限制

    纯上下文无关的解析器不能使用Python;您列出的所有解析器技术都比纯上下文无关的弱,因此它们也不能做到这一点。lexer中跟踪缩进并生成缩进/DEDENT标记的一个技巧,将缩进问题转化为显式的“括号”,这很容易由上下文无关的解析器处理


    大多数二进制文件也无法处理,因为它们通常在某个地方包含长度为N的列表,其中N在遇到列表体之前提供(这就是您给出的示例)。再一次,你可以绕过这个,用一个更复杂的黑客;某些东西必须保持嵌套列表长度的堆栈,解析器必须在它从一个列表元素移动到下一个列表元素时发出信号。最顶端的长度计数器递减,解析器返回一个信号“reduce”或“shift”。其他更复杂的链接结构通常很难以这种方式解析。让解析器以这种方式进行协作并不总是容易的。

    问题中的两个示例都不是上下文无关的,因此严格来说,它们不能用上下文无关的语法进行解析。但实际上,它们都很容易解析

    python算法在python中有很好的描述(尽管您需要在上下文中阅读)。这里描述的是一个预处理步骤,在该步骤中,行首的空白被系统地替换为
    INDENT
    DEDENT
    标记

    澄清一下:这不是一个真正的预处理步骤,重要的是要观察到它发生在隐式和显式的线连接之后。(参考手册中的前几节描述了这些过程。)特别是,行在括号、大括号和大括号内隐式连接,因此该过程与解析交织在一起

    实际上,直线连接和缩进算法都可以通过编程实现;通常,这些操作将在自定义扫描程序(标记器)内完成,该扫描程序同时维护一组括号和缩进级别。然后可以使用正常的上下文无关算法解析令牌流,但是令牌化器(尽管它可能使用正则表达式)需要上下文敏感逻辑(例如,计算空间)。[注1]

    类似地,包含显式大小的格式(如大多数序列化格式,包括PNG文件、Google protobufs和HTTP分块编码)不是上下文无关的,但显然很容易标记化,因为标记器只需读取长度,然后读取那么多字节

    有各种上下文相关的形式主义,它们肯定有其用途,但在实际解析中,最常见的策略是使用图灵等价的形式主义(如任何编程语言,可能会使用诸如
    flex
    之类的扫描生成器进行扩充)用于标记器和解析器的上下文无关形式。[注2]


    注意事项:

  • Python缩进不是上下文无关的,这一点可能并不明显,因为上下文无关语法可以接受某些类别的协议。例如,
    {ωω-1 |ω∈∑*}
    (所有偶数长度回文的语言)与上下文无关,就像
    {anbn}
    一样

    然而,这些示例无法扩展,因为在上下文无关的语言中,唯一可能的计数一致性是括号。因此,虽然回文是上下文无关的(您可以使用单个堆栈实现检查),但是显然非常相似的
    {ω|ω∈∑*}
    不是,也不是,
    {anbncn}

  • 其中一种形式是“正则”表达式中的反向引用,这可能在某些PEG实现中可用。反向引用允许表达各种上下文敏感语言,但不允许表达所有上下文无关语言。不幸的是,带有反向引用的正则表达式在实践中真的很糟糕,因为确定字符串是否与带有反向引用的正则表达式匹配的问题是NP完全的。你可能会在姐妹SE网站上发现有趣的东西。(你可能想以一种可以在该网站上提问的方式重新表述你的问题,)