protected SymbolicExpressionGrammar(SymbolicExpressionGrammar original, Cloner cloner)
            : base(original, cloner)
        {
            emptyGrammar = new EmptySymbolicExpressionTreeGrammar(this);

            foreach (ISymbol symbol in symbols.Values)
            {
                RegisterSymbolEvents(symbol);
            }

            programRootSymbol = cloner.Clone(original.programRootSymbol);
            startSymbol       = cloner.Clone(original.StartSymbol);
            defunSymbol       = cloner.Clone(original.defunSymbol);

            maximumFunctionArguments   = original.maximumFunctionArguments;
            minimumFunctionArguments   = original.minimumFunctionArguments;
            maximumFunctionDefinitions = original.maximumFunctionDefinitions;
            minimumFunctionDefinitions = original.minimumFunctionDefinitions;
        }
    protected SymbolicExpressionGrammar(SymbolicExpressionGrammar original, Cloner cloner)
      : base(original, cloner) {
      emptyGrammar = new EmptySymbolicExpressionTreeGrammar(this);

      foreach (ISymbol symbol in symbols.Values)
        RegisterSymbolEvents(symbol);

      programRootSymbol = cloner.Clone(original.programRootSymbol);
      startSymbol = cloner.Clone(original.StartSymbol);
      defunSymbol = cloner.Clone(original.defunSymbol);

      maximumFunctionArguments = original.maximumFunctionArguments;
      minimumFunctionArguments = original.minimumFunctionArguments;
      maximumFunctionDefinitions = original.maximumFunctionDefinitions;
      minimumFunctionDefinitions = original.minimumFunctionDefinitions;
    }