可以說,我有以下EBNF: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,包括日e「 - 」。
問題:除了寫下每個有效的字母和數字組合之外,還有其他辦法嗎?
我當前的解決方案:
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";
問題:ProductNo的組合物(Digitgroup, 「 - 」,Lettergroup)不被再現。所以我需要將兩個EBNF合併爲一個,但我真的無法找到解決方法。
你可以驗證語法外面的約束:即,解析的事情,然後檢查它是否有一個可以接受的長度。 – gsg
謝謝,但我需要找到EBNF –