语句序列的BNF语法

cap*_*aig 1 language-design bnf

如果我为具有一系列语句的类c语言编写语法,那么定义语法的最标准方法是什么?

我的想法是做这样的事情:

<program> ::= <statement>
<statement> ::= <statement-head><statement-tail>
<statement-head> ::= <if-statement> | <var-declaration> | <assignment> | <whatever>
<statement-tail> ::= ; | ;<statement>
Run Code Online (Sandbox Code Playgroud)

但这对我来说感觉有点笨拙.我也考虑过制作

<program> ::= <statement>*
Run Code Online (Sandbox Code Playgroud)

要么

<statement> ::= <statement-head> ; | <sequence>
<sequence>  ::= <statement> <statement>
Run Code Online (Sandbox Code Playgroud)

类型制作.

是否有标准或可接受的方式来执行此操作.我希望我的AST尽可能干净.

Art*_*uer 7

一种非常常见的方式是:

<block-statement> ::= '{' <statement-list> '}' ;
<statement-list> ::= /* empty */ | <statement-list> <statement> ;
<statement> ::= <whatever> ';' ;

然后你定义实际的语句而不是键入<whatever>.将尾随分号作为单个语句的一部分包含在内而不是将它们放在非终端列表的定义中似乎更清晰.