/** Build an processor. */
  public BBProcessor build() {
    this.createdScopes = new HashMap<Scope, ProcScope>();
    this.codes = new HashMap<Code, ProcCode>();
    this.constants = new HashMap<Constant, PatternConstant>();

    BBProcessor processor = new BBProcessor();
    processor.setScope(createScope(conf.getRootScope()));
    processor.setPrefix(createTemplate(conf.getPrefix()));
    processor.setSuffix(createTemplate(conf.getSuffix()));
    processor.setParams(conf.getParams());
    processor.setConstants(new HashSet<PatternConstant>(constants.values()));
    processor.setNestingLimit(conf.getNestingLimit());
    processor.setPropagateNestingException(conf.isPropagateNestingException());

    // Init scopes
    for (ProcScope scope : createdScopes.values()) {
      scope.init();
    }

    return processor;
  }
 /**
  * Find or create the scope.
  *
  * @param scope the scope configuration
  * @return scope scope
  */
 private ProcScope createScope(Scope scope) {
   ProcScope created = createdScopes.get(scope);
   if (created == null) {
     created = new ProcScope(scope.getName());
     createdScopes.put(scope, created);
     created.setStrong(scope.isStrong());
     created.setIgnoreText(scope.isIgnoreText());
     if (scope.getParent() != null) {
       created.setParent(createScope(scope.getParent()));
     }
     Set<ProcCode> scopeCodes = new HashSet<ProcCode>();
     for (Code code : scope.getCodes()) {
       scopeCodes.add(createCode(code));
     }
     created.setScopeCodes(scopeCodes);
     created.setMin(scope.getMin());
     created.setMax(scope.getMax());
   }
   return created;
 }