最近,在语言解析器如何适应Chomsky层次结构的背景下,我一直在寻找一些乐趣。
什么是上下文相关文法的真实示例(即非理论上的示例)?
最近,在语言解析器如何适应Chomsky层次结构的背景下,我一直在寻找一些乐趣。
什么是上下文相关文法的真实示例(即非理论上的示例)?
Answers:
好问题。尽管如评论中所述,许多编程语言都是上下文敏感的,但上下文敏感通常不是在解析阶段解决的,而是在以后的阶段中解决的-也就是说,使用上下文无关的语法来解析语言的超集,并随后将其中一些解析树过滤掉。
但是,这并不意味着这些语言不是上下文相关的,因此下面是一些示例:
Haskell允许您定义用作运算符的函数,还可以定义这些运算符的优先级和关联性。换句话说,您无法为像这样的运算符表达式构建正确的解析树:
a @@ b @@ c ## d ## e
除非你已经被解析的优先级/结合性的声明@@
和##
:
infixr 8 @@
infixr 6 ##
第二个示例是Bencode,这是一种以内容长度为前缀的数据语言:
<length>:<contents>
这种格式的问题在于,没有上下文相关的内容几乎是不可能解析的,因为找出“字段”大小的唯一方法是通过解析字符串。
第三个示例是XML,假设允许使用任意标签名称:开始标签名称必须具有匹配的关闭标签:
<hi>
<bye>
the closing tag has to match bye
</bye>
</hi> <!-- has to match "hi" -->
据我所知,上下文敏感语法仅在自然语言处理中使用。编程语言解释器和编译器由于复杂而不会尝试解析上下文无关的语法(即使过去曾做过一些尝试)。
也许,您可以在这些库之一中找到一些实际使用的示例:
http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits
上下文敏感语法有时在编程语言语义的描述中使用。上下文相关语法的最全面使用也许是Algol68语言定义。它使用了两级上下文无关语法(请参阅http://en.wikipedia.org/wiki/Two-level_grammar)来描述Algol68程序的语法和语义。
我的几个同事使用van Wijngaarden语法指导了Algol68的实现(请参阅http://en.wikipedia.org/wiki/FLACC)。