2013-11-01 2 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 Letter max 5 Letter), но сумма токенов должна быть < = 5, включая го e "-".

Вопрос: Есть ли способ, кроме как писать все действующие комбинации Letter и Digit?

Мое текущее решение:

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 в один, но я действительно не могу понять, как это сделать.

+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

спасибо, но в основном вы также записываете все допустимые комбинации, просто с меньшими усилиями –