4

次のEBNFがあるとしましょう:

ProductNo   ::= Digitgroup "-" Lettergroup;
Digitgroup  ::= Digit Digit? Digit? Digit?;
Digit       ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
Lettergroup ::= Letter Letter? Letter? Letter? Letter?;
Letter      ::= "A" | "B" | "C" | "D" | "E" | "F" | "G"
            | "H" | "I" | "J" | "K" | "L" | "M" | "N"
            | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
            | "V" | "W" | "X" | "Y" | "Z";

ここで、ProductNo = 5 のトークンの最大数を設定したい

例:

Input : 1-A      (EBNF valid and Token < 5)
Input : 023-A    (EBNF valid and Token < 5)
Input : 0231-ABI (currently EBNF valid but Token = 8 > 5 so this should not be valid)
Input : 022-ABCDE(currently EBNF valid but Token = 9 > 5 so this should not be valid)

この入力例でわかるように、数字と文字の組み合わせは、EBNF が適合する限り (最小 1 桁 最大 4 桁)、(最小 1 文字 最大 5 文字) 変更できますが、トークンの合計は < = "-" を含めて 5。

質問: 文字と数字の有効な組み合わせをすべて書き留める以外に方法はありますか?

私の現在の解決策:

ProductNo   ::= Token Token Token Token? Token?;
Token       ::= Digit | Letter | "-";
Digit       ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
Letter      ::= "A" | "B" | "C" | "D" | "E" | "F" | "G"
            | "H" | "I" | "J" | "K" | "L" | "M" | "N"
            | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
            | "V" | "W" | "X" | "Y" | "Z";

問題点:品番の構成(桁、「-」、文字)が再現されない。したがって、2 つの EBNF を 1 つに結合する必要がありますが、これを行う方法がわかりません。

4

2 に答える 2

0

すべての有効な組み合わせを書き留めるよりもスマートな解決策があると思います。

ProductNo   ::= Case1 | Case2 | Case3
Case1       ::= Digit Digit? Digit? "-" Letter;
Case2       ::= Digit "-" Letter Letter? Letter?;
Case3       ::= Digit Digit? "-" Letter Letter?;
Digit       ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
Letter      ::= "A" | "B" | "C" | "D" | "E" | "F" | "G"
            | "H" | "I" | "J" | "K" | "L" | "M" | "N"
            | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
            | "V" | "W" | "X" | "Y" | "Z";

しかし、これを行うより賢い理由があるかどうかはわかりません。このソリューションが少し役立つことを願っています。

于 2013-11-03T15:05:46.470 に答える