【问题标题】:Is Pug context free?Pug 上下文是免费的吗?
【发布时间】:2018-07-20 07:05:00
【问题描述】:

我正在考虑制作一个 Pug 解析器,但除了众所周知的缩进是上下文敏感的(可以用词法分析器反馈循环轻松破解,使其几乎与 Python 采用的上下文无关),还有什么否则使它不是上下文无关的?

XML 标签绝对不是上下文无关的,每个起始标签都需要匹配一个结束标签,但是 Pug 没有这样的限制,这让我想知道我们是否可以将每个起始标识符解析为标签根的产生.

【问题讨论】:

  • 查看我的 Quora 回答,了解解析器如何工作,无论语言是否与上下文无关:quora.com/…

标签: parsing compiler-construction pug


【解决方案1】:

Pug 似乎缺少的主要内容,至少从对其网站的随意扫描来看,是对其语法的正式描述。甚至是非正式的描述。也许我没有找对地方。

不过,根据示例,它看起来并不糟糕。会有一些挑战;特别是,它没有统一的标记化上下文,所以扫描器会很复杂,不仅仅是因为缩进问题。 (我从关于空格的部分得到的印象是缩进规则比 Python 的要严格得多,但我没有找到它到底是什么的规范。在我看来,两个字符缩进后的前导空格是重要的空格. 但这并没有使事情复杂化;它甚至可以简化任务。)

将证明有趣的是处理嵌入式 JavaScript。您至少需要对嵌入的 JS 进行标记化,并且 JS 规范中的极端情况使得在不解析的情况下进行标记化并非易事。无论如何,仅仅标记化不足以知道嵌入式代码在哪里终止。 (对于词法挑战,请考虑正则表达式文字的正确标识。/= 可能是正则表达式的开始,也可能是除法运算符;后续{ 的标记方式将取决于该决定.) 模板字符串提出了另一个挑战(递归嵌入)。但是,确实存在 JavaScript 解析器,因此您可以利用其中一个。


换句话说,识别标签嵌套不会成为您项目中最具挑战性的部分。一旦您确定给定标记是一个标记,嵌套部分就很简单(并且与上下文无关),因为它是由缩进精确定义的,因此 DEDENT 标记将终止标记。

然而,值得注意的是,标签解析对于 XML(或类似 XML 的 HTML 变体)并不是特别具有挑战性。如果您采用关闭标签不能省略的 XML 规则(自关闭标签除外),那么关闭标签中的标记名不会影响正确输入的解析。 (如果关闭标签中的标签名与相应打开标签中的关闭标签不匹配,则输入无效。但打开和关闭标签之间的对应关系不会改变。)即使您采用 HTML-5 规则除非在特殊情况标记名的有限列表的情况下,关闭标记不能省略,那么理论上您可以使用 CFG 进行解析。 (然而,HTML-5 中的各种错误恢复规则远非上下文无关,因此仅适用于不需要重新匹配关闭标签的输入。)

Ira Baxter 在他在评论中引用的交叉链接帖子中明确指出了这一点:您通常可以通过在解析期间忽略它们并在后续分析中检测它们来实现语言的上下文相关方面,甚至在解析期间的语义谓词。正确匹配打开和关闭标记名将属于这一类,就像在标识符声明不影响解析的语言中的“使用前声明”规则一样。 (C 或 C++ 不是这样,但在许多其他语言中都是如此。)

即使不能忽略这些方面——例如 C typedefs——最简单的解决方案可能是使用模棱两可的 CFG 和产生所有可能解析的解析技术。生成解析森林后,您可以遍历备选方案并拒绝不一致的备选方案。 (在 C 的情况下,这将包括一个替代解析,其中名称是 typedef 的,然后在 typename 无效的上下文中使用。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2018-09-11
    • 2019-12-15
    • 2017-11-23
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多