【问题标题】:EBNF Maximum TokenEBNF 最大令牌
【发布时间】: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 中找到解决方案

标签: max bnf ebnf


【解决方案1】:

我假设您使用的是 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

【讨论】:

  • "GoodFormat - TooLong" 这正是我搜索的内容,非常感谢。符号对我来说并不重要。
【解决方案2】:

我认为有一个比写下每个有效组合更聪明的解决方案:

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

但我不知道是否有任何更聪明的为什么要这样做。我希望这个解决方案能有所帮助。

【讨论】:

  • 谢谢,但基本上你也会写下每个有效的组合,只是省力
猜你喜欢
  • 2014-11-19
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2011-06-10
相关资源
最近更新 更多