如何从语境敏感部分中分离出语境的无上下文部分?

时间:2013-05-17 09:17:11

标签: language-design context-free-grammar modularity parse-tree context-sensitive-grammar

我在comp.theory列表上阅读了这篇精彩的文章:

http://coding.derkeiler.com/Archive/General/comp.theory/2004-03/0189.html

海报指出大多数编程语言都定义了一个无上下文的核心,然后在解析树上运行其他算法来过滤掉语言中非法的构造:

  

这将语言的无上下文部分与   上下文敏感的部分 - 通常被认为是良好的做法   (一种用于语言设计的模块化“编程”学科)。

您能提供一个“Hello World”示例来说明这种技术吗?也就是说,提供一个简单的上下文敏感语言,识别无上下文的核心,然后勾画出如何使用无上下文核心解析输入,然后在解析树中过滤掉非法构造。

您能介绍一下讨论这种技术的文章或书籍吗?

2 个答案:

答案 0 :(得分:1)

最简单的非上下文语言之一是单词a n b n c n (a,b和c重复相同的次数,即abc,aabbcc,aaabbbccc,......)。

您可以使用无上下文语言{a n b n c m }的语法对其进行解析,其中c不受限制。获得解析树后,使用单独的算法检查c的重复次数是否等于a和b的重复次数。

答案 1 :(得分:0)

通常也进行过滤以消除语言的过度近似。我们为编程语言编写模糊但清晰的无上下文语法,然后使用树步行器或其他机制来删除不需要的派生。

一个参考:

另一方面,您还可以考虑将抽象语法树作为这样的过滤器进行处理的类型检查器。类型检查器根据非本地(上下文)信息拒绝解析器生成的树。例如:

1 + "1"

被语法接受,因为:

E ::= Int | String | E "+" E;

但是类型检查器说加法在整数和字符串之间不起作用并拒绝语言中的句子。类型检查器通过在解析和识别添加符号之后遍历树来执行此操作,然后可能在表中查找操作数的有效组合,并且如果组合不是有效的,则它开始抱怨。我想这通常是编译器的工作原理。见Aho等人。龙书。如果你抽象地谈论它,听起来会更有趣: - )