anchor.diff:     *     def('list', ref('element').separatedBy(char(',')));
      */
     void def(String name, Parser parser) {
  -    if (_defined.containsKey(name)) {
  +    if (_completed) {
  +      throw new StateError('Completed parsers cannot be changed');
  +    } else if (_defined.containsKey(name)) {
         throw new StateError('Duplicate production: $name');
       } else {
         _defined[name] = parser;
       }
  -  }
  -
  -  /**
  -   * Returns a reference to a production with a [name]. Only call this method
  -   * from [initialize].
  -   *
  -   * At the point of calling [ref] the production does not necessaryily have
  -   * to be defined yet. The constructor of the class makes sure to replace
  -   * and optimize references away before the grammar is run.
  -   */
  -  Parser ref(String name) {
  -    return _undefined.putIfAbsent(name, () {
  -      return failure('Uninitalized production: $name').setable();
  -    });
     }
   
     /**
  
positive.code:    *     redef('list', (parser) => parser.optional());
     */
    void redef(String name, Parser function(Parser)) {
      if (!_defined.containsKey(name)) {
        throw new StateError('Undefined production: $name');
      } else {
        _defined[name] = function(_defined[name]);
  
negative.code:     redef(name, (parser) => parser.map(function));
    }
  
  }
  