如果将参数添加到上下文无关文法中,将会得到什么?


13

我当时在考虑对倾向性敏感的语言的语法,如果将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)
    : indent 'if' expression ':' NEWLINE (statement(indent '    ')+)
    ;

我的问题:这种语法(带参数的CFG)是否有名称?

看起来为这种语法编写递归下降解析器并不难(参数基本上应该是解析器)。这种方法可能会有什么困难?

添加参数是否将支持的语言类提高到上下文无关?


1
如果参数可以接受的一组值是有限的,那么它仍然是无关紧要的上下文(然后可以遍历所有值并将其全部写出)。
棘手怪胎

1
值得注意的是,您的建议是针对具有固定缩进的缩进敏感语言。Python(和其他此类语言)不受此限制;他们接受用户想要的任何缩进。这不会影响可解析性(处理制表符除外),但是很难表达您的建议,至少据我所知。
rici


@HendrikJan,属性语法是一种通过语义动作来注释语法的方法,它们不控制语法分析。
AProgrammer

1
如果目标是处理缩进,那么它更适合于令牌生成器而不是解析器。缩进级别更改时,让令牌生成器发出虚拟INDENT和UNINDENT令牌。这样就无需使用有关缩进的信息来增强语言语法。
约翰·库格曼

Answers:


14

荷兰著名计算机科学家Cornelis HA Koster从1962年与LGLT Meertens共同撰写的论文“基本英语,一部分英语的生成语法”开始,对词缀语法(参数化的上下文无关语法)进行了广泛的研究。1970年,他提出了这一概念的形式主义。1971年的论文“用于编程语言的Affix语法”提供了有用的概述,我在Citeseer上找到了该版本。

在那篇论文中,Koster将他的形式主义(和另一个相似的形式)与Van Wijngaarden的二级语法进行了比较,发现它们非常相似。

迪克·格鲁内(Dick Grune)的无价注释分析技术参考书目包括大量其他有用的参考,用于词缀语法和其他非乔姆斯基式的形式主义。(书目见节18.2.6,虽然也有在其他章节有用的论文。)Grune井盖加盖语法简要解析技术的第二版的§15.3.2:实用指南(甚至更简单地在第一版(可在线获得)中提到,采用自顶向下(和其他)解析技术很容易。

除非参数的域是有限的,否则在这种情况下可以通过静态生成所有可能的生成式来生成CFG的方式将其删除,则词缀语法的类别无疑是上下文无关语法集的严格超集。(的词缀语法可以在上面的Dick Grune的“ 解析技术”参考中找到。)anbncn

Koster还是Algol 68报告的编辑,基于他对词缀语法的想法,他最初是编译器描述语言(CDL)的开发者。该工具箱及其后来的衍生工具已在生产中使用了很多年。该页面是我通过Google搜索找到的,但我不能保证其永久性,它具有指向CDL3的手册和下载站点的链接。


我觉得CDL语言更像是属性语法:可以通过外部定义的函数来计算属性的值。我会保留名称词缀语法,以用于在形式主义内定义词缀(属性)的值之间的关系的情况,例如Extended Affix Grammars
reinierpost

@reinierpost:您当然有权使用自己的术语;特权不限于拟人卵。但是,CDL手册本身声称“ CDL3是一种基于词缀语法的实现语言”,我认为应该将其考虑在内。(可在ftp.cs.kun.nl/pub/cdl3/cdl3-manual-1.2.7.pdf上找到手册)。这就是我在回答中所声称的:CDL是基于Koster在词缀语法上的工作。正如Grune所指出的,词缀和属性语法之间的差异很小。他的区别是词缀是否用于确定句法有效性。
rici

(引自手册的第一页。)
rici

我知道...你是对的。我的评论并不是要与您矛盾。
reinierpost

6

考虑CFG的抽水问题

接受语法

S -> A("")
A(p) -> p 
      | p '\n' A(p"*") '\n' p 

这描述了一个星形三角形:

*
**
***
**
*

无法将星形三角形分成 5个部分 ,使得也是星形三角形(非空)。{ u v n w x n y | n > 0 } v xuvwxy{uvnwxny|n>0}vx

这意味着星形三角形不是上下文无关的语言。

或更简单的例子:

S-> B("")
B(p)-> p 'a' p 'a' p
     | B(p 'b')

这描述了语言并非上下文无关。{bnabnabn|n0}


3

我从未见过这种形式主义出现过(即使在类似Grune的解析技术中也是如此),具体取决于如何定义“参数基本上应该是解析器”的细节,它看起来可以映射到van Wijngaarden两级语法,它们具有与无限制的相结构语法(即比上下文敏感功能更强大,您可以编写提供所有暂停程序的VW语法)。



据我所知,Koster和他的小组研究了两种词缀语法:1)Van Wijngaarden语法的受限形式,旨在使人们更容易识别。2)CDL语言,一种实用的编译器描述语言,无需任何显着的词缀值操作,但可以选择以目标语言(例如,汇编器)定义规则,从而使它们的图灵完整。
reinierpost
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.