parse_command(3) MudOS v21c2
(5 Sep 1994)
名称:
parse_command() - 尝试以给定样式(pattern)来配对一个字符串
语法:
int parse_command( string command, object env|object *oblist, string
pattern, mixed arg, ... );
整数 parse_command( 字符串 command, 物件 env|物件 *oblist, 字符串 pattern,
混合 arg, ... );
用法:
parse_command() 是通过操作在字符串上 sscanf(3) 的。它的运作类似于有一个样式和一个目的参数之变量集合的
sscanf(3)。它以传递其他变量的参照(refence)和数组的方式,结合唯一的外部函数(efun)
sscanf(3)。因此,parse_command() 将返回值置于它的参数上。
若 'command' 配对成功,parse_command() 会返回 1。
参数 'env' 或是 'oblist' 不是一个物件就会是一个物件数组。如果它是单一物件的话,它将会以增加此物件的
deep_inventory 方式来自动建立一个物件数组,例如下面这二个函数是等效的:
parse_command(cmd, environment(), pattern,
arg)
和
parse_command( cmd, ({ environment() })
+ deep_inventory(environment()), pattern, arg)
假设有一个字符串是 " 'get' / 'take' %i "
语法:
'word' 必备的文字(text)
[word] 可省略的文字
/ 选择性的记号(marker)
%o 单一项目(item),
物件
%l 生物(living
object)
%s 任何文字
%w 任何单字(word)
%p 串列(list)
(介系词)
%i 任何项目
%d 数字
0- 或是 tx(0-99)
'arg' 串列可以是零个或是多个参数。这些是如同 sscanf 内的结果变量。注意到每一个变量都需要一个
%。
不同 %_ 的返回类型是:
%o 返回一个物件
%s 返回单字的字符串
%w 返回单一单字的字符串
%p 可以是一个含有单字符串列的数组或是一个空变量
返回:
如果是空变量:一个字符串
如果是数组:array[0] 就是配对的单字
%i 返回一个下列格式的特定数组:
[0] = (int) +(wanted) -(order) 0(all)
[1..n] (object) 物件指针(objectpointers)
%l 返回一个下列格式的特定数组:
[0] = (int) +(wanted) -(order) 0(all)
[1..n] (object) 物件指针
%d 返回一个数值
用到所有已载入信息的 % 类型只有 %i 和 %l。事实上,除了 %l 在尝试剖析(parse)前会从所有物件串列中过滤掉非生物外,这些都是一样的。
%i 和 %l 的返回值也是最复杂的。他们返回一个由数字带头,接着是所有可能配对之物件组成的数组。一个典型由
%i、%l 配对的字符串看来像是 'three red roses',在这之中有数个构造可以被配对:
如果 numeral>0 则 tree, four, five 等会被配对;
如果 numeral<0 则 second, twentyfirst 等会被配对;
如果 numeral==0 则 'all' 或是一般的复数形式如 'apples'会被配对。
注意!
这个外部函数(efun)不管给定数值的隐含语意。若给予 'all apples' 或是
'second apple',它都不会关心的。%i 将会返回所有数组内可以配对的物件。它留给调用者来决定
'second' 在给定内容的意思。并且,当给定一个物件而非一个外显的(explicit)物件数组时,整个给定物件的递回内容将会被搜寻。它也留给调用者来决定实际上可看到的物件中,哪个是
'second' ,而不是返回之物件数组中第二个物件。
警告:
"%s %w %i" 这些类型的样式可能不如预期的有用。%w 将总会成功,以至于相对于
%s 的参数将总会是空的。
问题:
例子:
if (parse_command("spray car",environment(this_player()),
" 'spray' / 'paint' [paint] %i ",items))
{
/*
如果这个样式被配对的话,则 items 会返回在 'destargs'
之后如同上述 %i 的数组。
*/
}
MUDLIB 之支援:
为了使这个外部函数有用,它必须有来自 mudlib 的支援,它需要一组函数让它在判断机制(sensible
manner)内进行剖析前调用,以取得相关信息。
在早期的版本中,它使用在 LPC 物件中一般的 id() lfun 以找到一个特定字符串所指定的物件。由于它在剖析非常长的指令时,会产生数百甚至数千个调用,所以十分没有效率。
新的版本则依赖着提供这三个 'names' 串列的 LPC 物件。
1 - 一般单一的名字;
2 - 复数格式的名字;
3 - 公认的物件形容词。
以上可以由调用下列函数得到:
1 - string *parse_command_id_list();
2 - string *parse_command_plural_id_list();
3 - string *parse_command_adjectiv_id_list();
真正唯一需要的串列是第一个。如果第二个不存在的话,这个外部函数将会试着由单一串列建立出来。因为文法上的因素,它并不是完美到总是会成功。尤其当
'names' 不是单一单字而是片语时,更是如此。
The third is very nice to have because it makes constructs like
(译注:无法翻译此原文。)
除了这些函数应该存在于所有物件外,最好它们能置于基本的 mudlib 物件内,当中也有一些函数是母物件(master
object) 所需要的。这些虽不是绝对必须的,但它们真的给了这个外部函数额外的能力。
基本上,这些母物件的 lfuns 需要设定由每个物件得到之名称串列的预设值。
这些串列上的名字可应用于任何所有的物件上。在这些物件里的前三个对这些
lfuns 是一样的:
string *parse_command_id_list()
- 一般会返回: ({ "one", "thing" })
string *parse_command_plural_id_list()
- 一般会返回: ({ "ones", "things", "them"
})
string *parse_command_adjectiv_id_list()
最后二个是介系词的内定串列,所以:
string *parse_command_prepos_list()
- 一般会返回: ({ "in", "on", "under" })
string parse_command_all_word()
翻译:
Kenny@Broken.History 97.Jul.26 (printed 3/16/95)
回到上一页