BNF (或EBNF)语法的第一个(最上面的)规则是否必须表示入口点?例如,在wikipedia BNF page中,下面的美国邮政地址语法将<postal-address>作为第一个派生规则,同时也是入口点:
<postal-address> ::= <name-part> <street-address> <zip-part>
<name-part> ::= <personal-part> <last-name> <opt-suffix-part> <EOL>
| <personal-part> <name-part>
<personal-part> ::= <first-name> | <initial> "."
<street-address> ::= <house-num> <street-name> <opt-apt-num> <EOL>
<zip-part> ::= <town-name> "," <state-code> <ZIP-code> <EOL>
<opt-suffix-part> ::= "Sr." | "Jr." | <roman-numeral> | ""
<opt-apt-num> ::= <apt-num> | ""我是否可以自由地将<postal-address>规则放在第二个位置,并以下面的替代形式提供语法:
<name-part> ::= <personal-part> <last-name> <opt-suffix-part> <EOL>
| <personal-part> <name-part>
<postal-address> ::= <name-part> <street-address> <zip-part>
<personal-part> ::= <first-name> | <initial> "."
<street-address> ::= <house-num> <street-name> <opt-apt-num> <EOL>
<zip-part> ::= <town-name> "," <state-code> <ZIP-code> <EOL>
<opt-suffix-part> ::= "Sr." | "Jr." | <roman-numeral> | ""
<opt-apt-num> ::= <apt-num> | ""发布于 2013-09-16 09:11:34
不,这不是必需的。这只是一些人使用的一种约定。
在实践中,必须指定“目标规则”。我们有一组工具,可以识别目标非终结点的非终结点,您可以按任何顺序提供规则(包括目标规则)。您如何指定它可能超出了语法形式主义,或者可能是语法中包含的特殊规则。
作为一个实际问题,这不是什么大问题(好的,所以一些工具坚持你把所有的目标规则放在第一位,实际上并不是那么难),并且不是很难做好(好的,这个工具检查语法规则的左边,看看它是否匹配目标非终结符)。
当然,你需要知道你的工具是以什么方式工作的,但这需要大约2分钟的时间来弄清楚。
有些工具只允许一个目标规则。作为一个实际问题,real (重新设计,请参阅我的简历)解析器通常发现允许多个规则是有用的(考虑将COBOL解析为“整个程序”和"COPYLIBS"),因此您最终编写(笨拙地IMHO):
G = G1 | G2 | G3 ... ;
G1 = ...在这种情况下。还是没什么大不了的。这些约束都不会影响表现力,也不会耗费你太多的工程时间。
https://stackoverflow.com/questions/18818196
复制相似问题