【发布时间】:2016-03-13 14:07:26
【问题描述】:
我想找到下一个问题的解决方案,但是我需要将时间的EBNF写成年-月-日和月-日-年两种格式,以查看差异:
确定将日期写为结构化整数的一个优势:年、月、日 (1954-02-10),而不是按正常顺序 (02-10-1954)。
格式:年-月-日。 这是我想出的:
<NonZeroDigit> ::= ("1" | "2" | ... | "9")
<Month> ::= ( "0" <NonZeroDigit> ) | ( "1" ( "0" | "1" | "2" ) )
<Day> ::= ( "0" <NonZeroDigit> ) | ( ("1" | "2") <NonZeroDigit> ) | ("3" ( "0" | "1" ) )
<Year> ::= ( "000" <NonZeroDigit> ) |
( "00" <NonZeroDigit> <NonZeroDigit> ) |
( "0" <NonZeroDigit> <NonZeroDigit> <NonZeroDigit> ) |
( "1" <NonZeroDigit> <NonZeroDigit> <NonZeroDigit>) |
( "20" <NonZeroDigit> <NonZeroDigit> ) )
这一年是 2099 年,我想这还可以,这些规则有效,但是当时有没有更好的方法来编写 EBNF? 我错过了什么吗?
【问题讨论】:
-
您可以允许一个日期,例如 2 月 31 日吗?如果是这样,您可以通过定义
::= | 来简化。 “0”,让年份有四个数字。您将一直到 9999 年。否则,您将不得不辨别具有 28、30、31 天的月份。二月有 29 天的闰年呢? -
是的,忘记那些东西了哈哈。将再次检查。但我在正确的轨道上?
-
是的。这一切都是为了获得正确的分组,而不是过多地重复自己。还有一件事:当您将它们放在一起定义
时,您可能需要包含破折号“-”
标签: context-free-grammar ebnf context-free-language