2013-11-01 17 views
3

可以說,我有以下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, 「 - 」,Le​​ttergroup)不被再現。所以我需要將兩個EBNF合併爲一個,但我真的無法找到解決方法。

+0

你可以驗證語法外面的約束:即,解析的事情,然後檢查它是否有一個可以接受的長度。 – gsg

+0

謝謝,但我需要找到EBNF –

回答

3

我假設您使用的是W3C符號:http://www.w3.org/TR/REC-xml/#sec-notation,而不是標準ISO符號:http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form

如果我錯了,請指出您正在使用哪個EBNF!

在W3C的符號,你可以使用這個:

Digit  ::= [0-9] 
Letter  ::= [A-Z] 
GoodFormat ::= Digit+ "-" Letter+ 
Token  ::= Digit | Letter | "-" 
TooLong  ::= Token Token Token Token Token Token+ 
ProductNo ::= GoodFormat - TooLong 
+0

「GoodFormat - TooLong」這正是我所搜索的,非常感謝。這個符號對我來說並不重要。 –

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"; 

但我不知道是否有任何聰明爲什麼要這樣做。我希望這個解決方案有所幫助。

+0

的解決方案謝謝,但基本上你也寫下每一個有效的組合,只是用較少的努力 –