Re: [問題] Extra option與Illegal option的差別

作者: ypf791 (路人1號)   2012-11-17 22:41:41
為了行文方便定義一下用語
名詞:
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 之外好像也沒什麼好方法...
作者: XDucka (Duck)   2011-01-17 23:04:00
我也是慢慢try ref... 蠻花時間的XD
作者: ric2k1 (Ric)   2011-01-17 23:06:00
謝謝精闢的解析,不過關於錯誤訊息只要不要把錯的 parse 成對的,對的 parse 成錯的,就 OK. 錯誤訊息有出入沒有關係畢竟 parse 的順序不同都會造成訊息的不同,大家可以不用花時間在調成跟 ref 一樣 (每年好像都會有這個問題)
作者: ypf791 (路人1號)   2011-01-17 23:14:00
但就是會想調到全都一樣啊....
作者: mikechen25 (mikechen25)   2011-01-18 00:07:00
沒想到今天調了好久還是少調到一個東西...>~<
作者: Phantasnix (凰響)   2011-01-18 00:32:00
推 繼續慢慢玩ref
作者: ypf791 (路人1號)   2011-01-18 09:30:00
剛剛跑了一下 發現mtn和mtd用的邏輯是不一樣的(倒)
作者: pochih   2011-01-18 10:44:00
感謝ypf大與老師的解說
作者: david942j (文旋)   2011-01-18 16:39:00
mtn -a 1 a 這樣是extra mtn -a 1 這樣是missing 怎麼都覺得不太合理= ="這種錯誤訊息會讓使用者陷入無窮迴圈吧
作者: ric2k1 (Ric)   2011-01-18 17:11:00
建議已經寫完了的人再來追究這個錯誤訊息吧! 不算分的 XD
作者: caspercat (caspercat)   2011-01-21 04:36:00
不算分推!!

Links booklink

Contact Us: admin [ a t ] ucptt.com