次の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 つに結合する必要がありますが、これを行う方法がわかりません。