# 分区参数迷你语言
和其他常见的分区工具不同，**ampart**是完全非互动式的，这意味着你应该把所有你想干的事都通过命令行参数提交给它

因为这一特别的的使用需求，我特别定义了一门迷你语言，以让每一个分区操作（定义，编辑）都能用一个参数来描述，并且复杂的操作可以在一次命令行操作中实现。这么语言很直白地叫做 **(ampart) 分区参数迷你语言**，下文中将使用**parg**作为简称来指代它

##  基本语法
一个parg是能用单一的Linux命令行参数表示的由空字节作为结尾的字符串，由以下这些形式，由明显的 **:** 来分割其中多个部分
 - {名称}:{偏移}:{大小}:{掩码}
   - 叫做**定义器**parg，同一格式也可以用在**调整器**上，不过它们各自的自参数由不同要求*
 - ^{选择器}{操作符}({操作符后缀})
   - 叫做**修改器**parg

注意：上述内容中，由符号{}框起来的是需要用户填写的子参数，结果parg中不应包含{}符号本身；符号:和^应该原模原样输入；符号()框起来的是可选的子参数，如果不需要的话可以省去

## 定义器
### 语法
 - {名称}:{偏移}:{大小}:{掩码}

### 例子
 - bootloader:0:4M:0
   - *一个bootloader分区，放置在0偏移处，大小4MiB，掩码0*
 - data:::
   - *一个data分区，作为最后一个分区。根据具体模式，紧跟着上一个分区，或是隔着8MiB，占用所有空余空间，自动掩码*
 - system:+8M:2G:2
   - *一个system分区，作为最后一个分区。前面和上一个分区之间留8MiB空隙，大小2GiB，掩码2*

## 修改器
### 语法
 - ^{选择器}{操作符}({操作符后缀})

### 选择器
 - {名称} *名称选择器*
   - 现存的具体分区名
 - {相对值} *相对选择器*
   - 非负值从开头到结尾选择（0选择第一个）
   - 负值从结尾到开头选择（-1选择最后一个）
#### 例子
 - ``userdata``
   - 选择一个名为userdata的分区
   - 例子parg: ``^userdata?``
 - ``4``
   - 选择第五个分区
   - 例子parg: ``^4:my::+1G:``
 - ``-2``
   - 选择倒数第二个分区
   - 例子parg: ``^-2%Cloned``
### 操作符
 - ? *删除操作符*
   - 删除分区，其后分区向前各移动一位
   - 无后缀
 - % *克隆操作符*
   - 克隆分区，把新的克隆出来的分区作为最后一个分区
   - 后缀：{名称} *克隆器*
     - 克隆器应该包含一个目前未使用的名字
   - 例子:
     - ``%CE_STORAGE``
       - 克隆分区为CE_STORAGE
       - 例子parg: ``^-1%CE_STORAGE``
 - @ *移位操作符*
   - 把一个分区移位
   - 后缀：*{移位器}*
     - {相对}{非负数} *相对移位器*
       - +{非负数}
         - 向右移动*
       - -{非负数}
         - 向左移动*
     - (=){数字} *绝对移位器*
       - ={负数} *自右向左放置，-1为最后一位*
       - (=){非负数} *自左向右放置，0作为第一位*
    - 例子:
      - @-2
        - 把分区向左移动两个位置，穿过的两个分区各向右移动一个位置
        - 例子parg: ``^-1@-2``
      - @+3
        - 把分区向右移动三个位置，穿过的三个分区各向左移动一个位置
        - 例子parg: ``^roms@+3``
      - @7或@=+7
        - 把分区移动为第八个分区。如果向左移动，穿过的分区各向右移动一位；如果向右移动，穿过的分区各向左移动一位；如果没有移动，无事发生
        - 例子parg: ``^system@7``, ``^system@=+7``
      - @=-4
        - 把分区移动为倒数第四个分区（前面应该有3个其他分区），和上一个逻辑一样
        - 例子parg: ``^logo@=-7``
 - : *Adjust Operator* 
   - 后缀：{调整器}
     - {名称}:{偏移}:{大小}:{掩码}
       - 和**定义器**的子部分相同
   - 例子:
     - :bootleg::-1G:
       - 把分区改名为bootleg，大小缩小1G
       - 例子parg: ``^boot:bootleg::-1G:``
     - ::+2G:+1G:4
       - 把分区的偏移增加2G，大小增加1G，掩码改为4
       - 例子parg: ``^factory::+2G:+1G:4``  