code: public ExprCfg parseExpr()
    {
      ExprCfg left = parseTerm();
  
      while (true) {
        ExprToken token = scanToken();
  
        switch (token) {
        case COND_BINARY:
          {
            ExprCfg defaultExpr = parseExpr();
  
            left = new ExprCfgCondNull(left, defaultExpr);
          }
          break;
  
        case EQ: case NE: case LT:
        case LE: case GT: case GE:
        case MATCHES:
          left = parseCmpExpr(token, left, parseTerm());
          break;
  
        case COND:
          left = parseCondExpr(left);
          break;
  
        default:
          unreadToken();
          return left;
            
            /*
            case ExprToken.SEMICOLON:
              left = new SemicolonExpr(left, parseExpr());
              break;
  
            case Expr.ASSIGN:
              left = parseAssignExpr(left, parseTerm());
              break;
  
            case Expr.LAMBDA:
              left = parseLambdaExpr(left);
              break;
              */
  
          /*
            case '?':
              left = parseCondExpr(left);
              break;
              */
  
              /*
            case Expr.OR:
              left = parseOrExpr(token, left, parseTerm());
              break;
  
            case Expr.AND:
              left = parseAndExpr(token, left, parseTerm());
              break;
              */
  
              /*
            case Expr.CONCAT:
              left = new ConcatExpr(left, parseExpr());
              break;
  
            case Expr.ADD: case Expr.SUB:
              left = parseAddExpr(token, left, parseTerm());
              break;
  
            case Expr.MUL: case Expr.DIV: case Expr.MOD:
              left = parseMulExpr(token, left, parseTerm());
              break;
              */
        }
      }
    }
docs: expr ::= term