docs: protected ExqlUnit compileUnit() {
  
          // 在输入中查找  PREFIX 字符
          Matcher matcher = PATTERN_KEYWORD.matcher(pattern);
  
          // 输出的单元列表
          ArrayList<ExqlUnit> units = new ArrayList<ExqlUnit>();
  
          // 组装位置
          int fromIndex = 0;
  
          while ((position < length) && matcher.find(position)) {
  
              // 修改当前位置
              position = matcher.end();
  
              // 检查  :expr | $expr 形式的子句
              String expr = matcher.group(1);
              if (expr != null) {
  
                  // 创建文本子句
                  if (matcher.start() > fromIndex) {
                      units.add(new TextUnit(pattern.substring(fromIndex, matcher.start())));
                  }
  
                  // 创建  :expr | $expr 形式的子句
                  if (expr.charAt(0) == '$') {
  
                      // 创建  $expr 形式的子句, 作为拼接处理
                      units.add(new JoinExprUnit(expr));
                  } else {
  
                      // 创建  :expr 形式的子句
                      units.add(new ExprUnit(expr));
                  }
  
                  fromIndex = position;
  
                  continue;
              }
  
              // 检查  {...}? 的语法
              String group = matcher.group(2);
              if (group != null) {
  
                  // 创建文本子句
                  if (matcher.start() > fromIndex) {
                      units.add(new TextUnit(pattern.substring(fromIndex, matcher.start())));
                  }
  
                  // 编译  {...} 内部的子句
                  ExqlCompiler compiler = new ExqlCompiler(group);
                  System.out.println("DELETE>>>group=" + group);
                  ExqlUnit unit = compiler.compileUnit();
  
                  // 创建   {...}? 形式的子句
                  units.add(new OptionUnit(unit));
  
                  fromIndex = position;
  
                  continue;
              }
  
              // 检查  # 后面的关键字
              String keyword = matcher.group(3);
  
              // 处理  #(:expr) 形式的子句
              if (keyword == null) {
  
                  // 获取括号内的内容
                  expr = findBrace(BRACE_LEFT, BRACE_RIGHT);
                  if (expr != null) {
  
                      // 创建文本子句
                      if (matcher.start() > fromIndex) {
                          units.add(new TextUnit(pattern.substring(fromIndex, matcher.start())));
                      }
  
                      // 创建  #(:expr) 形式的表达式
                      units.add(new ExprUnit(expr));
  
                      fromIndex = position;
                  }
              }
              // 处理  ##(:expr) 形式的子句
              else if (keyword.equals(SHARP) || keyword.equals(JOIN)) {
  
                  // 获取括号内的内容
                  expr = findBrace(BRACE_LEFT, BRACE_RIGHT);
                  if (expr != null) {
  
                      // 创建文本子句
                      if (matcher.start() > fromIndex) {
                          units.add(new TextUnit(pattern.substring(fromIndex, matcher.start())));
                      }
  
                      // 创建  ##(:expr) 形式的表达式
                      units.add(new JoinExprUnit(expr));
  
                      fromIndex = position;
                  }
              }
              // 处理  #if(:expr) {...} #else {...} 形式的子句
              else if (keyword.equals(KEYWORD_IF)) {
  
                  // 获取括号内的内容
                  expr = findBrace(BRACE_LEFT, BRACE_RIGHT);
                  if (expr != null) {
  
                      // 编译  {...} 单元
                      ExqlUnit unitIfTrue = compileBlock();
                      if (unitIfTrue != null) {
  
                          // 创建文本子句
                          if (matcher.start() > fromIndex) {
                              units.add(new TextUnit(pattern.substring(fromIndex, matcher.start())));
                          }
  
                          ExqlUnit unitIfFalse = null;
  
                          // 匹配  #else {...} 子句
                          if (match(SHARP_ELSE, position)) {
  
                              // 编译  {...} 单元
                              unitIfFalse = compileBlock();
                          }
  
                          // 创建  #if(:expr) {...} #else {...} 形式的子句
                          units.add(new ChoiceUnit(expr, unitIfTrue, unitIfFalse));
  
                          fromIndex = position;
                      }
                  }
              }
              // 处理  #for(variant in :expr) {...} 形式的子句
              else if (keyword.equals(KEYWORD_FOR)) {
  
                  // 获取括号内的内容
                  expr = findBrace(BRACE_LEFT, BRACE_RIGHT);
                  if (expr != null) {
  
                      // 编译  {...} 单元
                      ExqlUnit unit = compileBlock();
                      if (unit != null) {
  
                          // 创建文本子句
                          if (matcher.start() > fromIndex) {
                              units.add(new TextUnit(pattern.substring(fromIndex, matcher.start())));
                          }
  
                          // 循环变量名
                          String variant = null;
  
                          // 解析  variant in :expr 表达式
                          Matcher matcherIn = PATTERN_IN.matcher(expr);
                          if (matcherIn.matches()) {
                              variant = matcherIn.group(1);
                              expr = matcherIn.group(2);
                          }
  
                          // 创建  #for(variant in :expr) {...} 形式的子句
                          units.add(new ForEachUnit(expr, variant, unit));
  
                          fromIndex = position;
                      }
                  }
              }
          }
  
          if (fromIndex < length) {
              // 写入 PREFIX 字符后的内容。
              units.add(new TextUnit(pattern.substring(fromIndex)));
          }
  
          if (units.size() > 1) {
  
              // 返回集合对象
              return new BunchUnit(units);
  
          } else if (!units.isEmpty()) {
  
              // 返回单个对象
              return units.get(0);
  
          } else {
  
              // 返回空对象
              return new EmptyUnit();
          }
      }