【发布时间】:2013-11-01 14:29:03
【问题描述】:
假设我有以下 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 的最大 Tokens
例子:
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 位字母),数字和字母的组合就会有所不同,但令牌的总和有为
问题:除了写下每个有效的字母和数字组合之外,还有其他方法吗?
我目前的解决方案:
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 合二为一,但我真的想不出办法。
【问题讨论】:
-
您可以在语法之外验证约束:即解析事物,然后检查它是否具有可接受的长度。
-
谢谢,但我需要在 EBNF 中找到解决方案