第九章 句法分析

  SETR,SENDR和LIFTR是一部ATN语法中的基本动作,它们分别用来对不同层次上的寄存器进行存取操作,如图9.13所示。每一个子网络都有自己的一张寄存器表。SETR把本层寄存器表中一个指定寄存器的内容设置为<form>的值。SENDR是一个仅用于PUSH弧的准备动作,它使得被这条PUSH弧所启动的下

图示

图9.13 对不同层次的寄存器进行存取的动作

一层寄存器表中指定寄存器的内容被设置为<form>的值。如果把被PUSH弧所启动的新阿络看作是一个子程序的话,那么SENDR的作用就如同是向这个子程序传递参数。LIFTR是SENDR的逆操作,它把<form>的值赋与上一层寄存器表中某个指定的寄存器。对本层寄存器进行操作的其他两个动作是ADDL和ADDR,前者把<form>的值添加到指定寄存器的头上(即表左),后者把同样的内容附加到指定寄存器的尾端(即表右)。
  在每个动作中可以使用许多不同的<form>,其中最基本的是变量*和LEX,以及函数GETR,GETF,BUILDQ和其他人ISP函数。
  变量LEX的值总是等于输入串中的当前词,其词形保持和输入串中一样,也即维持词法分析以前的原始形式。变量*是指输入的当前项,它的值已在前面介绍过了。
  函数GETR回送的是本层寄存器表中指定寄存器的当前内容,如果该寄存器未曾赋值,其回送值为NIL。GETF检查指定词<word>的词典条目,并回送该条目中指定特征<feature>的值。如果<word>省缺,就默认是输入串中的当前词。因此,(GETF NUMBER)回送的是当前词的"数"特征--SG(单数)或PL(复数)。
  BUILDQ是一个用来建造局部结构的函数,它的第一个变元是一个由常量和特殊标记组成的任意样板,第二个变元是<form>。它通过用<form>的值去依次取代样板中那些特殊标记,然后把所得结果作为局部结构回送出来。在样板(template)中用到的特殊标记有如下几种:
  + 它预期相应的<form>是一个寄存器的名字,并要求用该寄存器的内容去取代这个特殊标记。
  # 它预期相应的<form>是一个LISP表达式,要求对这个表达式求值,然后用这个值去取代标记#。
  * 要求用变量*的值来取代它,它不需要有相应的<form>。
  @ 出现在表达式(@X1X2…Xn)中,它利用LISP的APPEND函数把子表X1…Xn拼接成一张大表,它也不需要有相应的<form>出现。
  举例来说,假设寄存器DET的内容是表:(DET THE),同时在一条CAT弧上的当前词是"books",则表达式:
  (BUILDQ (NP+(N *) (NU#)) DET (GETF NUMBER))
回送的结构为:
  (NP(DET THE)(N BOOK)(NU PL))。
如果除了刚才提到的寄存器以外,寄存器ADJS已被设置为:
  ((ADJ OLD)(ADJ DUSTY)(ADJ RED))那么表达式:
  (BUILDQ(@(NP+)+((N *)(NU#)))
      DET ADJS(GETF NUMBER))

将产生如下结构作为回送值:
  (NP(DET THE)(ADJ OLD)(AU DUSTY)(ADJ RED)
    (N BOOK)(NU PL))