/
CDC-1.2b/
CDC-1.2b/src/
parent $user_parsers
object $verb_parser

var $root child_index 0
var $root fertile 0
var $root manager $verb_parser
var $root owners [$core]
var $root writable [$verb_parser]
var $root readable ['parameters, 'methods, 'code]
var $root trusted []
var $root owned [$verb_parser]
var $root inited 1
var $root dbref 'verb_parser

method match_verb
    arg str, user;
    var templates, template, fields, word, obj, verb_info, i, j, output;
    
    // Resort to verb cache.
    templates = $verb_cache.templates();
    output = [];
    catch ~objnf, ~verbnf {
        for template in (templates) {
            fields = match_template(strsub(template, "%this", "*"), str);
            if (!fields)
                continue;
            j = 1;
            for word in (explode(template)) {
                if (word == "%this") {
                    obj = user.match_env_nice(fields[j]);
                    verb_info = obj.verb_info(template);
                    if (((verb_info[2]) != 'remote) && (!(user.local_to_environment(obj))))
                        user.tell("!  You cannot do that from here.");
                    else
                        obj.(verb_info[1])(@fields);
                    return;
                } else if (word == "*=*") {
                    j = j + 2;
                } else {
                    j = j + 1;
                }
            }
        }
    } with handler {
        switch (error()) {
            case ~verbnf:
                user.tell("! You can't do that to that object.");
            default:
                user.tell("!  " + ((traceback()[1])[2]));
        }
        return;
    }
.

method parse
    arg user, str, next_parser, [other_parsers];
    var templates, template, fields, word, obj, verb_info, i, j, output;
    
    // Match verbs on objects.
    // (this is a rather icky system involving the verb cache, etc..
    // I'm planning to redo this completely eventually.
    // Resort to verb cache.
    templates = ($verb_cache.templates()) + (user.local_verb_templates());
    output = [];
    catch ~objnf, ~verbnf {
        for template in (templates) {
            fields = match_template(strsub(template, "%this", "*"), str);
            if (!fields)
                continue;
            j = 1;
            for word in (explode(template)) {
                if (word == "%this") {
                    obj = user.match_env_nice(fields[j]);
                    verb_info = (| obj.verb_info(template) |);
                    if (!verb_info)
                        return "That object is not a part of the VR.";
                    if (((verb_info[2]) != 'remote) && (!(user.local_to_environment(obj))))
                        return "You cannot do that from here.";
                    else
                        return [obj, verb_info[1], @fields];
                } else if (word == "*=*") {
                    j = j + 2;
                } else {
                    j = j + 1;
                }
            }
        }
    } with handler {
        return "You can't do that to that object.";
    }
    return next_parser.parse(user, str, @other_parsers);
.