1

BNF(或EBNF)语法的第一个(最顶层)规则是否必须代表入口点?例如,从维基百科 BNF 页面,下面的美国邮政地址语法<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> | ""
4

1 回答 1

1

不,这不是要求。这只是某些人使用的约定。

在实践中,必须指定“目标”规则。我们有一套工具可以识别非终结符,也就是目标非终结符,您可以按任意顺序提供规则(包括目标规则)。你如何指定可能是语法形式主义之外的,也可能是包含在语法中的特殊规则。

实际上,这没什么大不了的(好吧,所以有些工具坚持把所有的目标规则放在第一位,实际上并没有那么难),而且做得好也不是那么难(好吧,该工具检查了语法规则,看看它是否匹配目标非终结符)。

当然,您需要知道您的工具的工作方式,但这需要大约 2 分钟才能弄清楚。

一些工具只允许一个目标规则。实际上,真正的(重新设计,请参阅我的简历)解析器通常会发现允许多个规则很有用(考虑将 COBOL 解析为“整个程序”和“COPYLIBS”),因此您最终会编写(笨拙地恕我直言):

 G = G1 | G2 | G3 ... ;
 G1 = ...

在这种情况下。仍然没什么大不了的。这些限制都不会损害表现力,或者实际上会花费您大量的工程时间。

于 2013-09-16T01:11:33.593 回答