解释语言的语言

1. 解释语言的语言

  抽象地说,开始设计一门新语言时,我们需要对这门语言进行描述,描述的主要目的在于告诉使用者如何根据一系列规则来理解使用该语言得到一系列结果(即语言的语义)。

  这个【描述】所使用的媒介是一个用来解释语言的语言,或者称为meta-language(元语言)。而使用meta-language来描述新语言的过程,就是实现这门新语言的解释器的过程。

  举个例子,如同自然语言的语法一样,一个人学习一门自然语言的过程,其实就是在脑中构造一个这门语言的解释器,而这个解释器就是这门语言的语法集合。而这些语法,就是描述这门语言的语言(所以神奇的是人类在婴儿时期没有任何语言基础的情况下,是如何一步一步构建母语的解释过程的?)。  

  但是和自然语言不同的是,自然语言相对的宽松语法,造成很多场景下的多义性(同时也产生了自然语言所特有的朦胧的美感 :p )。而程序语言的严谨性,要求使用一个能够形式化的meta-language来进行构造,程序语言需要严格地验证其一些性质,以此保证其可执行性和准确性(你大概不会喜欢一个按自己心情返回不同结果的系统)。

2. 对PL meta-language的建模

  工欲善其事,必先利其器。设计一门语言的开始,我们得先对meta-language进行建模。

  考虑一下,我们想?1.表达式,2.求值。

  1 告诉我们如果有一个表达式 B ,那么B属不属于这个语言的表达式范畴。2 则告诉我们表达式 B 的求值过程。

  我们发现使用集合很适合用来对我们设想的meta-language进行建模。具体过程如下:

  对于1,通过定义包含递归结构的BNF表示表达式集合。我们现在想设计一个能表示OR运算的语言,其能表示嵌套的or运算。其BNF表示如下:

  B = t  |  f  |  ( B . B )

  "." 表示或运算符,上面的这个BNF表示确定了表达式集合B,前两项 t (true) 和 f(false) 称为终结项( 其实我更喜欢叫原子项 atom ),因为这两项是最基本的元素;这个集合中的元素有:B = { t , f , (t.f) , (t.( f . t)) .... }。因为我们在上面的第三项加入了一个递归定义,所以这个集合现在包含了嵌套的表达式而不仅仅是简单的 t 或者 f 。

  对于 2,使用 relation 来对求值过程进行构建,在构建之前,先说明一下relation一些后面将用到的性质。

  1.   relation 是一个有序对 ( ordered pair ) 集合 ( A relation is a set whose element is ordered pair) ,如果有关系 r 使得 a r bc r d , 那么 就是有序对集合: r = {<a,b>,<c,d>}
  2.   对于任意x,有<x,x>∈ ,则称关系 具有自反性(reflexive)
  3.   对于任意<x,y>∈ r ,<y,z>∈ r,有 <x,z>∈ ,则称关系 r  具有传递性(transitive)
  4.   对于任意<x,y>∈ ,有<y,x>∈ ,则称关系 r  具有对称性(symmetric)

猜你喜欢

转载自www.cnblogs.com/hyj2357/p/10473587.html