為了行文方便定義一下用語
名詞:
token: 命令名稱後面跟的東西 用空格切開後的字串集
flag: 形如 -* 的 token
argument: 沒有 flag 跟在前面的 token
option: 某些 flag 要求後面要緊跟著一個引數 令其為 option of -(flag name)
可能會圖方便只寫 option
形容詞:
optional: 被方括弧括起來的東西
essential: 被角括弧括起來的東西
==============================================================================
以下要用 MTDelete (mtd) 舉例 所以先分析一下它的 tokens:
Argument: 沒有
-Index : essential flag 需要 option
-Random : essential flag 需要 option
-Array : optional flag 不需要 option
特殊規定: -i 和 -r 為二選一
==============================================================================
我的認知大概是這樣:
Illegal:
1.如果一個 argument 或 flag 不在命令可能接受的範圍內就是 Illegal
例如
mtd -a -i 2 8
經過解析的結果
-a 是 沒有 option 的 flag
-i 是 有 option=2 的 flag
8 是 argument
因為 mtd 沒有 argument
所以 8 是 Illegal
2.如果一個 argument 或 option (of flag) 的型態錯誤
例如
mtd -a -i k
因為 k 不是數字 違反 option of -i 的規定 所以是 Illegal
Extra:
1.如果一個 argument 或 flag 可能被命令接受
但數量上超過了命令的需求 則是 Extra
例如
mtd -a -i 2 -a
則 -a 就是可以被接受但是多打了一個 所以第二個 -a 是 Extra
Note: 如果是像 mtd -i 2 -r 這樣 因為是二選一 所以後面那個就會視為多出來
Missing:
1.如果輸入的命令經解析認為某個 flag 沒有 option 但它其實需要 option 的話
就會判定為 Missing
例如
mtd -a -i
-i 需要 option 可是沒給這樣
2.目前來講 好像只有在最後一個 token 是需要 option 的 flag 的時候
才會變成 Missing
==============================================================================
其實這些並不是最麻煩的
最討厭的是複合情況 或者說多重解釋
像是
mtd -i 8 -r -a
一開始到 -i 8 -r 都還好
可是 -a 可以視為 flag (Missing)
也可以把 -a 視為 -r 的 option (Illegal)
也可以先說 -r 撞了 -i (Extra)
到底優先度是怎樣就很難解釋 (其實是原 PO 根本沒搞懂)
除了慢慢玩 ref 之外好像也沒什麼好方法...